Wie übergebe ich eine Passphrase an ssh-add, ohne eine Eingabeaufforderung auszulösen?

Wie übergebe ich eine Passphrase an ssh-add, ohne eine Eingabeaufforderung auszulösen?

Ich habe gelesen man ssh-addund sehe kein Flag zum Übergeben einer Passphrase, wie wir sshes hier-p haben .

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-addManpage:

 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=$passphrasedie 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 .3Sie können die Verzögerung ( oder ) erhöhen, sleep 1wenn der rechte Teil der Pipeline langsam startet. Für komplexere Aufgaben verwenden Sieexpect. Nicht verwenden, sshpassda es wirklich nicht besser ist als scriptund selbst unterliegtRennen.

verwandte Informationen