Ich habe gelesen man ssh-add
und sehe kein Flag zum Übergeben einer Passphrase, wie wir haben .ssh
es hier-p
Ich habe es versucht
# the -K is for macOS's ssh-add but it's not relevant
ssh-add -q -K ~/.ssh/id_rsa <<< $passphrase
Aber ich bekomme die folgende Ausgabe:
ssh_askpass: exec(/usr/X11R6/bin/ssh-askpass): No such file or directory
Wie kann ich ein Passwort weitergeben, ohne eine Eingabeaufforderung auszulösen?
Aktualisieren
Um dem, was ich tue, mehr Kontext zu verleihen, erstelle ich ein Skript, das SSH-Schlüssel für mich erstellt. Es generiert die Passphrase, den SSH-Schlüssel unter Verwendung dieser Passphrase und fügt ihn dem Agenten hinzu.
# ...
passphrase=$(generate_password)
ssh-keygen -t rsa -b 4096 -C $email -f $filename -N $passphrase -q
ssh-add -q -K $filename
Nach Stephens Antwort bin ich mir nicht sicher, wie das funktionieren würde. Scheint, als müsste ich ein temporäres Skript erstellen und es auf der Festplatte speichern, damit SSH_ASKPASS funktioniert. Irgendwelche Ideen?
Antwort1
Aus der ssh-add
Manpage:
DISPLAY and SSH_ASKPASS
If ssh-add needs a passphrase, it will read the passphrase from
the current terminal if it was run from a terminal. If ssh-add
does not have a terminal associated with it but DISPLAY and
SSH_ASKPASS are set, it will execute the program specified by
SSH_ASKPASS (by default ``ssh-askpass'') and open an X11 window
to read the passphrase. This is particularly useful when calling
ssh-add from a .xsession or related script. (Note that on some
machines it may be necessary to redirect the input from /dev/null
to make this work.)
Damit können wir ein bisschen schummeln.
Wir beginnen ohne Identitäten im Agenten:
$ ssh-add -l
The agent has no identities.
Jetzt brauchen wir also ein Programm, das das Passwort liefert:
$ cat x
#!/bin/sh
echo test123
Und überzeugen Sie dann ssh-add, dieses Skript zu verwenden:
$ DISPLAY=1 SSH_ASKPASS="./x" ssh-add test < /dev/null
Identity added: test (sweh@godzilla)
Und da ist es:
$ ssh-add -l
2048 SHA256:07qZby7TafI10LWAMSvGFreY75L/js94pFuNcbhfSC0 sweh@godzilla (RSA)
Bearbeiten, um basierend auf der überarbeiteten Frage Folgendes hinzuzufügen:
Das Passwort könnte als Variable übergeben werden und das Askpass-Skript könnte diese Variable verwenden.
Zum Beispiel:
$ cat /usr/local/sbin/auto-add-key
#!/bin/sh
echo $SSH_PASS
$ SSH_PASS=test123 DISPLAY=1 SSH_ASKPASS=/usr/local/sbin/auto-add-key ssh-add test < /dev/null
Identity added: test (sweh@godzilla)
Im dargestellten Workflow würden Sie SSH_PASS=$passphrase
die neu generierte Passphrase verwenden.
Antwort2
script(1)
Sie können es als Mini verwenden expect
.
Unter Linux:
{ sleep .1; echo password; } | script -q /dev/null -c 'ssh-add /path/to/identity'
Unter BSD:
{ sleep .1; echo password; } | script -q /dev/null ssh-add /path/to/identity
sleep .3
Sie können die Verzögerung ( oder ) erhöhen, sleep 1
wenn der rechte Teil der Pipeline langsam startet. Für komplexere Aufgaben verwenden Sieexpect
. Nicht verwenden, sshpass
da es wirklich nicht besser ist als script
und selbst unterliegtRennen.