Anstatt Ihr Kennwort mehrmals einzugeben, können Sie mit pssh
und dessen -A
Schalter einmal danach fragen und das Kennwort dann an alle Server in einer Liste weiterleiten.
ANMERKUNG: Mit dieser Methode können Sie diese jedoch nicht verwenden. Daher müssen Sie ssh-copy-id
Ihre eigene Methode zum Anhängen Ihrer SSH-Pub-Schlüsseldatei an die Datei Ihres Remote-Kontos rollen ~/.ssh/authorized_keys
.
Beispiel
Hier ist ein Beispiel, das die Arbeit erledigt:
$ cat ~/.ssh/my_id_rsa.pub \
| pssh -h ips.txt -l remoteuser -A -I -i \
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7
Das obige Skript ist im Allgemeinen so aufgebaut:
$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'
pssh
Details auf hohem Niveau
cat <pubkey>
gibt die öffentliche Schlüsseldatei an aus pssh
pssh
verwendet den -I
Schalter, um Daten über STDIN aufzunehmen
-l <remote user>
ist das Konto des Remote-Servers (wir gehen davon aus, dass Sie auf allen Servern in der IP-Datei den gleichen Benutzernamen haben)
-A
fordert Sie pssh
auf, nach Ihrem Kennwort zu fragen und es dann für alle Server zu verwenden, mit denen eine Verbindung hergestellt wird
-i
erzählt pssh
eher eine Ausgabe an STDOUT zu senden als Speicher in Dateien (dessen Standardverhalten)
'...cmds to add pubkey...'
- Das ist der schwierigste Teil des Geschehens, also werde ich das von selbst aufschlüsseln (siehe unten).
Befehle, die auf Remoteservern ausgeführt werden
Dies sind die Befehle, pssh
die auf jedem Server ausgeführt werden:
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
In Ordnung:
Setzen Sie die umask des Remote-Benutzers auf 077, damit alle Verzeichnisse oder Dateien, die wir erstellen, die entsprechenden Berechtigungen haben, und zwar wie folgt:
$ ls -ld ~/.ssh ~/.ssh/authorized_keys
drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
-rw------- 1 remoteuser remoteuser 771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
Erstellen Sie das Verzeichnis ~/.ssh
und ignorieren Sie die Warnung, wenn es bereits vorhanden ist
- Setzen Sie eine Variable
$afile
mit dem Pfad zur Datei authorized_keys
cat - >> $afile
- Eingaben von STDIN nehmen und an authorized_keys-Datei anhängen
sort -u $afile -o $afile
- Sortiert die authorized_keys-Datei eindeutig und speichert sie
ANMERKUNG: Das letzte Bit behandelt den Fall, dass Sie die obigen Schritte mehrmals auf denselben Servern ausführen. Dadurch wird verhindert, dass Ihr Pubkey mehrmals angehängt wird.
Beachten Sie die einzelnen Ticks!
Achten Sie auch besonders darauf, dass alle diese Befehle in einfachen Anführungszeichen stehen. Das ist wichtig, da wir erst $afile
ausgewertet werden möchten , nachdem es auf dem Remote-Server ausgeführt wurde.
' \
..cmds... \
'
Ich habe das Obige erweitert, damit es hier leichter zu lesen ist, aber ich führe es im Allgemeinen in einer einzigen Zeile aus:
$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'
Bonusmaterial
Durch die Verwendung von können pssh
Sie darauf verzichten, Dateien erstellen zu müssen und entweder dynamischen Inhalt mithilfe von bereitzustellen, -h <(...some command...)
oder Sie können eine Liste von IPs mithilfe eines anderen pssh
Switches von erstellen -H "ip1 ip2 ip3"
.
Beispielsweise:
$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...
Das oben Genannte könnte verwendet werden, um eine Liste von IPs aus meiner ~/.ssh/config
Datei zu extrahieren . Sie können natürlich auch verwenden printf
, um dynamische Inhalte zu generieren:
$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....
Beispielsweise:
$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09
Sie können auch verwenden seq
, um formatierte Zahlenfolgen zu generieren!
Referenzen & ähnliche Tools zu pssh
Wenn Sie nicht wie oben beschrieben verwenden möchten, stehen Ihnen pssh
einige andere Optionen zur Verfügung.