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

Не уверенный, как выйти /, но некоторые альтернативные решения:

  • Используя шестнадцатеричную escape-последовательность: 's/foo \x2F bar/it worked!/'
  • Используя другой разделитель, такой как подчеркивание: 's_foo / bar_it worked!_'
14
18.07.2014, 01:22
7 ответов

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

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

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

ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST
2
27.01.2020, 19:50

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

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 (i.e., after the last line)
        # 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

Примечание :Это требует использования GNU sed. Поскольку в вопросе указано "Linux", GNU sed, вероятно, присутствует.

3
27.01.2020, 19:50

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

for server in `cat server.txt`;  
do  
    sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server  
done

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

8
27.01.2020, 19:50

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

Цикл for также будет работать.

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
0
27.01.2020, 19:50

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

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

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

0
27.01.2020, 19:50

Я внес некоторые изменения в решение, предоставленное Ильей Шершоффом, спасибо.

#!/bin/bash
keys=${1:-*.pub}
echo update ssh-keys: ${keys}

cat targets | grep -vE '^(\s*$|#)' | sed 's/#.*$//g' | while read host user
do
   echo "# adding public ssh-keys for $user@$host"
   #for k in $(ls *.pub);
   for k in ${keys};
   do
      echo "# adding public key $k"
      # ssh-copy-id -f -i $k $user@$host
      touch ${k%\.pub}
      ssh-copy-id -i $k $user@$host
   done
done

Этот сценарий добавляет открытые ключи id -rsa -*.pub к пользователям в списке хостов при условии, что среда, в которой он выполняется, имеет доступ.

Примерtargets:

# targets formatted with host and user
# host user

# host1
hostname1 user1
hostname1 user2
# host2
hostname2 user1
hostname2 user2

Чтобы использовать сценарий ssh ​​-copy -id, который предотвращает дублирование нескольких ключей в авторизованных _ключах, мы можем использовать следующий обходной путь для запуска без закрытого ключа. для проверки входа в систему, если ваша версия сценария ssh -copy -id еще не поддерживает опцию -f force , как моя:

     # workaround ssh-copy-id -f option missing
     # ssh-copy-id -f -i $k $user@$host
     touch ${k%\.pub}
     ssh-copy-id -i $k $user@$host
0
11.05.2021, 10:54

Теги

Похожие вопросы