Ich habe eine beliebige Anzahl von Servern mit der gleichen Benutzer / Pass-Kombination. Ich möchte ein Skript schreiben (das ich einmal aufrufe) damit
ssh-copy-id user@myserver
wird für jeden Server aufgerufen. Da sie alle den gleichen Benutzer / Pass haben, sollte dies einfach sein, aber ssh-copy-id
ich möchte, dass ich das Passwort jedes Mal separat eingebe, was den Zweck meines Skripts zunichte macht. Es gibt keine Möglichkeit, ein Passwort einzugeben, dh ssh-copy-id -p mypassword user@myserver
.
Wie kann ich ein Skript schreiben, das bei Aufforderung automatisch das Kennwortfeld ausfüllt ssh-copy-id
?
Antworten:
Schauen Sie sich sshpass an . Legen Sie Ihr Passwort in eine Textdatei und machen Sie so etwas:
quelle
Sie können expect verwenden, um auf die Kennwortabfrage zu warten und Ihr Kennwort zu senden:
Speichern Sie das Skript, machen Sie es ausführbar und rufen Sie es wie folgt auf:
./login.expect user@myserver
quelle
spawn
? Aus Gründen, die ich nicht kontrollieren kann, bin ich mit Bash v3.2 festgefahren.spawn: command not found
spawn
ist ein Schlüsselwort expect (siehe Handbuch expect (1)). Klingt so, als würde das Skript eher als Shell interpretiert als erwartet. Hast du das schon installiert? Was passiert, wenn Sie erwarten, direkt ausgeführt:expect -f login.expect user@myserver
spawn ssh-copy-id -o StrictHostKeyChecking=no $argv
Die Antwort von quanta ist ziemlich gut, aber Sie müssen Ihr Passwort in eine Textdatei schreiben.
Aus der Manpage "sshpass":
Sie können das Kennwort also einmal während des Skripts erfassen, in einer Variablen speichern, das Kennwort als Echo ausgeben und als Eingabe übergeben.
Ich mache das die ganze Zeit und es funktioniert gut. Beispiel:
echo "Please insert the password used for ssh login on remote machine:" read -r USERPASS for TARGETIP in $@; do echo "$USERPASS" | sshpass ssh-copy-id -f -i $KEYLOCATION "$USER"@"$TARGETIP" done
quelle
Dies ist ein Problem mit der ssh-copy-id. Außerdem wird bei jeder Ausführung ein Schlüssel hinzugefügt. Wenn Sie den Vorgang automatisieren, wird Ihre authorized_keys-Datei schnell mit doppelten Schlüsseln überfüllt. Hier ist ein Python-Programm, das beide Probleme vermeidet. Es wird vom Steuerungsserver ausgeführt und speichert die Schlüssel von einem Remoteserver auf einem anderen Remoteserver.
quelle
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:
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 den gleichen 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 Remoteservern 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, 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.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
Ansible's authorized_key_module
scheint für neue Maschine nicht zu funktionieren. Ich muss zuerst ssh-copy-id xxx, also suche ich nach einer Möglichkeit, einfach ansible add ssh-key für eine neue Maschine zu verwenden. Irgendeine Idee?Eines der parallelen SSH-Tools (clusterssh, mssh, pssh) ist möglicherweise für Sie geeignet.
Verwenden Sie beispielsweise cssh, um sich bei allen Computern anzumelden und den Schlüssel selbst anzuhängen.
quelle
Einige Dinge, die die Rechnung passen könnten:
Wie in anderen Antworten erwähnt, ist sshpass wahrscheinlich die einfachste Lösung.
quelle
Ich möchte betonen, wie schlecht eine Idee ist:
Hier ist eine Implementierung, die ein bisschen sicherer ist ...
quelle