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