Скопіюйте відкритий ключ 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'

чому вам потрібно котитися на локальних, оскільки ви скопійовані з одного центрального місця на віддалені?
klerk

Мені потрібно додати відкритий ключ центрального сервера, отже, локальний сервер. Вибачте за непорозуміння.
користувач67186

Відповіді:


20

За допомогою цього простого циклу ви можете його автоматизувати та поширити на всі віддалені сервери.

#!/bin/bash
for ip in `cat /home/list_of_servers`; do
    ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done

Привіт, я приймаю твою прихильницю, і вона спрацювала чудово. Дякую
користувач67186

+1. Я великий шанувальник дуже простого сценарію стилю, який виконує роботу!
Laith Leo Alobaidy

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

Для копіювання відкритого ключа у вас є щось вбудоване. Тож замість цього catі sshвикористовуйте це: -

ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST

Я хочу виконати команду з копіювання загальнодоступного центрального сервера на віддалені сервери, які існують у файлі IP. Сценарій повторюється через них. Отже, ваш приклад тут може бути не корисним. Дякую
користувач67186

Не потрібно використовувати опцію -i, якщо ви використовуєте стандартне розташування відкритого ключа.
Laith Leo Alobaidy

0

Ви можете зробити це за допомогою простого циклу та вбудованого списку серверів таким чином:

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

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


ssh-copy-idвже запропоновано в деяких інших відповідях.
РальфФрідль

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.