Не уверенный, как выйти /
, но некоторые альтернативные решения:
's/foo \x2F bar/it worked!/'
's_foo / bar_it worked!_'
С этой простым циклом вы можете автоматизировать его и распространяться на все удаленные серверы.
#!/bin/bash
for ip in `cat /home/list_of_servers`; do
ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done
Для копирования вашего открытого ключа у вас есть что-то встроенное в сам openssh. Поэтому вместо cat
и ssh
используйте это: -
ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST
Принятый ответ не сработает, если нужно скопировать чужой открытый ключ на несколько машин. Итак, я придумал следующее решение:
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, вероятно, присутствует.
Вот мой простой скрипт для копирования ssh -keygen на несколько серверов без запроса пароля каждый раз.
for server in `cat server.txt`;
do
sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server
done
Для этого требуется sshpass , который может потребоваться установить отдельно либо через пакет, либо из исходного кода.
Предположим, у вас есть файл со списком 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
Вы можете сделать это с помощью простого цикла while -и встроенного списка серверов, подобного этому:
while read SERVER
do
ssh-copy-id user@"${SERVER}"
done <<\EOF
server1
server2
server3
EOF
Наличие списка внутри скрипта избавляет от отдельных файлов данных, которые могут оказаться неуместными.
Я внес некоторые изменения в решение, предоставленное Ильей Шершоффом, спасибо.
#!/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