Skopiuj klucz publiczny ssh do wielu hostów Linux

14

Próbuję skopiować plik .ssh / id_rsa.pub z naszego serwera centralnego na wiele serwerów. Mam następujący skrypt, którego zwykle używam do wypychania zmian na różne serwery.

#!/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

Ale w tym przypadku muszę przechwycić klucz publiczny na serwerze lokalnym, a następnie dodać go do wielu serwerów. Czy istnieje sposób, używając powyższego skryptu dokumentu, aby wykonać następujące czynności.

cat .ssh/id_rsa.pub |ssh tony@0.0.0.0 'cat > .ssh/authorized_keys'
użytkownik67186
źródło
dlaczego musisz wybierać lokalnie, skoro skopiowano Cię z jednej centralnej lokalizacji do pilotów?
klerk
Muszę dodać klucz publiczny serwera centralnego, stąd serwer lokalny. Przepraszam za zamieszanie.
user67186,

Odpowiedzi:

20

Dzięki tej prostej pętli możesz ją zautomatyzować i przenieść na wszystkie zdalne serwery.

#!/bin/bash
for ip in `cat /home/list_of_servers`; do
    ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done
klerk
źródło
Cześć, akceptuję twoją odpowiedź i działała dobrze. Dzięki
użytkownik67186,
+1. Jestem wielkim fanem bardzo łatwego stylu skryptowego, który wykona zadanie!
Laith Leo Alobaidy
4

Oto mój prosty skrypt do skopiowania ssh-keygen na wiele serwerów bez pytania o hasło za każdym razem.

for server in `cat server.txt`;  
do  
    sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server  
done
Rajesh Kumar
źródło
3

Akceptowana odpowiedź nie zadziała, jeśli trzeba umieścić klucz publiczny innej osoby na wielu komputerach. Wymyśliłem następujące rozwiązanie:

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

Ten skrypt dodaje nowy klucz do użytkowników na liście komputerów, pod warunkiem, że ma dostęp do środowiska, w którym jest uruchamiany.

Przykład tc-agents-list.txt:

root@10.10.0.1
root@10.10.0.2
root@10.10.0.3
root@10.10.0.4
Ilya Sheershoff
źródło
2

Aby skopiować klucz publiczny, masz coś wbudowanego w openssh. Zamiast tego cati sshużyj tego: -

ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST
początkujący
źródło
Chcę wykonać polecenie kopiowania publicznego serwera centralnego na zdalne serwery, które istnieją w pliku IP. Skrypt przechodzi przez nie. Twój przykład może więc nie być przydatny. Dzięki
użytkownik67186,
Nie musisz używać opcji -i, jeśli używasz domyślnej lokalizacji klucza publicznego.
Laith Leo Alobaidy
0

Możesz to zrobić za pomocą prostej pętli while i listy serwerów osadzonych w następujący sposób:

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

Posiadanie listy w skrypcie eliminuje oddzielne pliki danych, które mogą zostać zgubione.

solaris
źródło
ssh-copy-idzostało już zasugerowane w kilku innych odpowiedziach.
RalfFriedl
0

Zakładając, że masz plik z listą adresów IP serwerów, nazwa SERWER i tylko adresy IP serwerów są zdefiniowane.

To dla pętli również będzie działać.

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
klaus
źródło