Ich habe kürzlich den Benutzernamen / das Kennwort für eine Liste von Servern erhalten und möchte meinen öffentlichen SSH-Schlüssel an diese Server weitergeben, damit ich mich leichter anmelden kann.
Damit es klar ist:
- Auf den Remoteservern ist kein öffentlicher Schlüssel vorhanden, mit dem ich dies automatisieren kann
- Dies ist das erste Mal, dass ich mich bei diesen Servern anmelde, und ich möchte nicht ständig meine Anmeldeinformationen eingeben müssen, um darauf zuzugreifen
- Ich möchte mein Passwort auch nicht immer wieder
ssh-copy-id
in einer for-Schleife eingeben .
ssh-copy-id
mein Passwort immer wieder durch.Antworten:
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: Bei 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:
Das obige Skript ist im Allgemeinen so aufgebaut:
pssh
Details auf hohem Niveaucat <pubkey>
gibt die öffentliche Schlüsseldatei an auspssh
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 denselben Benutzernamen haben)-A
fordert Siepssh
auf, nach Ihrem Kennwort zu fragen und es dann für alle Server zu verwenden, mit denen eine Verbindung hergestellt wird-i
erzähltpssh
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 Remote-Servern ausgeführt werden
Dies sind die Befehle,
In Ordnung:pssh
die auf jedem Server ausgeführt werden: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:
Erstellen Sie das Verzeichnis
~/.ssh
und ignorieren Sie die Warnung, wenn es bereits vorhanden ist$afile
mit dem Pfad zur Datei authorized_keyscat - >> $afile
- Eingaben von STDIN nehmen und an authorized_keys-Datei anhängensort -u $afile -o $afile
- Sortiert die authorized_keys-Datei eindeutig und speichert sieANMERKUNG: Das letzte Bit behandelt den Fall, in dem 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.Ich habe das Obige erweitert, damit es hier leichter zu lesen ist, aber ich führe es im Allgemeinen in einer einzigen Zeile aus:
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 anderenpssh
Switches von erstellen-H "ip1 ip2 ip3"
.Beispielsweise:
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 verwendenprintf
, um dynamische Inhalte zu generieren:Beispielsweise:
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.quelle
pssh
ist ein Python-Skript und kann mit installiert werdenpip install pssh
. (2) Sie können auchssh
Schlüssel auf allen Servern gleichzeitigssh-keygen
durchlaufenpssh
. (3) Nach dem Generieren der Schlüssel können Sie die Schlüssel "all-to-all" verteilen, indem Sie alle öffentlichen Schlüssel in einer Schleife auf den lokalen Computerauthorized_keys
kopieren, sie zu einem gemeinsamen zusammenfügen und auf jeden Computer kopieren.ssh_agent
Ichssh_add
kann mit den Passwörtern helfen.cat
award (of old): Um eine Pipeline mit dem Inhalt einer Datei zu starten, können Sie einfach die Eingabe von dieser Datei umleiten.pssh
.cat ~/.ssh/*.pub | ...
. Es kann sein oder auch nicht, was Sie in dieser Situation wollen.Alternative verwendet
xargs
,sshpass
undssh-copy-id
:Angenommen, Ihre Anmeldeinformationen befinden sich in credentials.txt im Format
user:password@server
:Du könntest es tun:
Hinweis: Denken Sie daran, credentials.txt nach der Verwendung zu entfernen !
quelle
ClusterSSH bietet auf jedem Computer ein Fenster und ein gemeinsames Fenster zur Steuerung aller Fenster.
Wenn wir über 10 Maschinen sprechen, wird dies funktionieren. Wenn wir über 100 Maschinen sprechen, wird es zu viele Fenster geben.
Das Schöne an ClusterSSH ist, dass Sie, wenn ein Computer nicht zu 100% mit dem Rest identisch ist, einfach auf das Fenster klicken und nur Tastatureingaben an diesen Computer senden können, bevor Sie wieder Tastatureingaben an alle Computer senden.
quelle
Die Verwendung von Ansible ist recht einfach. Ersetzen Sie einfach
<USER>
mit dem echten Anmeldenamenquelle
Einige Dinge, die möglicherweise die Rechnung passen könnten:
Wie in anderen Antworten erwähnt,
sshpass
ist wahrscheinlich die einfachste Lösung.quelle
Hier haben Sie zwei Möglichkeiten:
Sie können eine Datei mit allen IP-Adressen der Server erstellen und dann die folgenden Schritte ausführen
Angenommen
servers.txt
ist die Datei mit IPs / Hostnamen.Sie können alle Ihre IPs / Hostnamen in eine Schleife einfügen und
ssh-copy-id
wie folgt ausführen :quelle
ssh-copy-id
in einer for-Schleife eingeben ."