Kopieren Sie den öffentlichen ssh-Schlüssel auf mehrere Linux-Hosts


14

Ich versuche, .ssh / id_rsa.pub von unserem zentralen Server auf mehrere Server zu kopieren. Ich habe das folgende Skript, das ich normalerweise verwende, um Änderungen auf die verschiedenen Server zu übertragen.

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

Aber in diesem Fall muss ich den öffentlichen Schlüssel auf dem lokalen Server kategorisieren und diesen dann mehreren Servern hinzufügen. Gibt es eine Möglichkeit, mithilfe des oben genannten Dokumentskripts Folgendes auszuführen?

cat .ssh/id_rsa.pub |ssh tony@0.0.0.0 'cat > .ssh/authorized_keys'

Warum müssen Sie lokal katzen, da Sie von einem zentralen Ort auf Fernbedienungen kopiert werden?
Klerk

Ich muss den öffentlichen Schlüssel des zentralen Servers und damit den lokalen Server hinzufügen. Entschuldigung für die Verwirrung.
User67186

Antworten:


20

Mit dieser einfachen Schleife können Sie sie automatisieren und auf alle Remote-Server verteilen.

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

Hallo, ich akzeptiere deine Antwort und es hat gut funktioniert. Vielen Dank
user67186

+1. Ich bin ein großer Fan eines sehr einfachen Skriptstils, der die Arbeit erledigt!
Laith Leo Alobaidy

4

Hier ist mein einfaches Skript, um ssh-keygen auf mehrere Server zu kopieren, ohne jedes Mal nach dem Passwort zu fragen.

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

3

Die akzeptierte Antwort funktioniert nicht, wenn der öffentliche Schlüssel einer anderen Person auf mehreren Computern gespeichert werden muss. Also habe ich die folgende Lösung gefunden:

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

Dieses Skript fügt den Benutzern in der Liste der Computer den neuen Schlüssel hinzu, sofern die Umgebung, in der es ausgeführt wird, über den Zugriff verfügt.

Beispiel von 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

Zum Kopieren Ihres öffentlichen Schlüssels haben Sie etwas in openssh selbst eingebaut. Also anstatt catund sshbenutze dies: -

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

Ich möchte den Befehl ausführen, mit dem die öffentlichen Daten des zentralen Servers auf ferne Server kopiert werden, die in der IP-Datei vorhanden sind. Das Skript durchläuft sie. Daher ist Ihr Beispiel hier möglicherweise nicht hilfreich. Thanks
user67186

Sie müssen die Option -i nicht verwenden, wenn Sie den Standardspeicherort des öffentlichen Schlüssels verwenden.
Laith Leo Alobaidy

0

Sie können dies mit einer einfachen while-Schleife und einer eingebetteten Serverliste wie folgt tun:

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

Wenn die Liste im Skript enthalten ist, werden separate Datendateien entfernt, die möglicherweise verlegt werden.


ssh-copy-idwurde bereits in einigen anderen Antworten vorgeschlagen.
RalfFriedl

0

Angenommen, Sie haben eine Datei mit der Server-IP-Liste, dem Namen SERVER und nur den IP-Adressen der Server definiert.

Diese for- Schleife funktioniert auch.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.