Скопируйте открытый ключ ssh на несколько хостов Linux

14

Я пытаюсь скопировать .ssh / id_rsa.pub с нашего центрального сервера на несколько серверов. У меня есть следующий скрипт, который я обычно использую для отправки изменений на разные серверы.

#!/bin/bash


for ip in $(<IPs); do
    # Tell the remote server to start bash, but since its
    # standard input is not a TTY it will start bash in
    # noninteractive mode.
    ssh -q "$ip" bash <<-'EOF'



EOF

done

Но в этом случае мне нужно отследить открытый ключ на локальном сервере, а затем добавить его на несколько серверов. Есть ли способ с помощью приведенного здесь скрипта документа, чтобы выполнить следующее.

cat .ssh/id_rsa.pub |ssh tony@0.0.0.0 'cat > .ssh/authorized_keys'
user67186
источник
зачем вам кататься на локальном, так как вы копируете из одного центрального места на удаленные?
клерк
Мне нужно добавить открытый ключ центрального сервера, следовательно, локальный сервер. Извините за путаницу.
user67186

Ответы:

20

С помощью этого простого цикла вы можете автоматизировать его и распространить на все удаленные серверы.

#!/bin/bash
for ip in `cat /home/list_of_servers`; do
    ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done
Клерк
источник
Привет, я принимаю ваш ответ, и он работал нормально. Спасибо
user67186
+1. Я большой поклонник очень простого стиля сценариев, которые делают свою работу!
Лейт Лео Алобайди
4

Вот мой простой скрипт для копирования ssh-keygen на несколько серверов без запроса пароля каждый раз.

for server in `cat server.txt`;  
do  
    sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server  
done
Раджеш Кумар
источник
3

Принятый ответ не сработает, если нужно поместить чужой открытый ключ на несколько машин. Итак, я пришел к следующему решению:

cat add-vassal-tc-agents.sh

#!/bin/bash
set -x # enable bash debug mode
if [ -s vassal-public-key.pub ]; then # if file exists and not empty
    for ip in `cat tc-agents-list.txt`; do # for each line from the file
        # add EOL to the end of the file and echo it into ssh, where it is added to the authorized_keys
        sed -e '$s/$/\n/' -s vassal-public-key.pub | ssh $ip 'cat >> ~/.ssh/authorized_keys'
    done
else
    echo "Put new vassal public key into ./vassal-public-key.pub to add it to tc-agents-list.txt hosts"
fi

Этот сценарий добавляет новый ключ пользователям в списке машин при условии, что среда, на которой он работает, имеет доступ.

Пример tc-agents-list.txt:

root@10.10.0.1
root@10.10.0.2
root@10.10.0.3
root@10.10.0.4
Илья Ширсхофф
источник
2

Для копирования вашего открытого ключа у вас есть что-то встроенное в сам openssh. Так что вместо этого catи sshиспользуйте это:

ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST
beginer
источник
Я хочу выполнить команду, копирующую общедоступный центральный сервер на удаленные серверы, которые существуют в IP-файле. Скрипт перебирает их. Таким образом, ваш пример может не пригодиться здесь. Спасибо
user67186
Нет необходимости использовать опцию -i, если вы используете расположение открытого ключа по умолчанию.
Лейт Лео Алобайди
0

Вы можете сделать это с помощью простого цикла while и списка встроенных серверов, например:

while read SERVER
do
    ssh-copy-id user@"${SERVER}"
done <<\EOF
server1
server2
server3
EOF

Наличие списка внутри скрипта избавляет от отдельных файлов данных, которые могут оказаться неуместными.

Солярис
источник
ssh-copy-idуже было предложено в некоторых других ответах.
RalfFriedl
0

Предполагается, что у вас есть файл со списком IP-адресов серверов, именем SERVER и определены только IP-адреса серверов.

Это для цикла будет работать также.

for user in $(awk '{print $1}' SERVER | awk '{printf "user1@""%s"(NR==0?RS:"\n"), $1}' ) ;
do
        ssh-copy-id -f -i id_rsa_k2.pub $user
done
клаус
источник