Скопируйте открытый ключ 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

Ответы:


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

Я хочу выполнить команду, копирующую общедоступный центральный сервер на удаленные серверы, которые существуют в 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.