2016-07-13 22 views
3

Ich laufe Shell-Skript mit ssh Befehl in meiner Anwendung. Der verwendete private Schlüssel wird mit der Passphrase verschlüsselt und das Problem ist - ich kann ihn bei der Anfrage nicht interaktiv weitergeben. Der Schlüssel wurde nicht in ssh-agent hinzugefügt. Ich kann ssh-add my_key nicht ausführen, weil die Passphrase interaktiv übergeben werden soll. Es ist gut für Terminal-Kommunikation, aber nicht so gut in der Anwendung zu verwenden.Geben Sie SSH-Schlüssel Passphrase über Umgebungsvariable

The man page sagt:

DISPLAY und SSH_ASKPASS

Wenn ssh-add ein Passwort benötigt, wird er das Passwort vom aktuellen Terminal lesen, wenn es von einem Terminal ausgeführt wurde. Wenn ssh-add kein Terminal zugeordnet ist, aber DISPLAY und SSH_ASKPASS gesetzt sind, wird das Programm ausgeführt, das mit SSH_ASKPASS angegeben wurde, und ein X11-Fenster zum Lesen der Passphrase geöffnet. Dies ist besonders nützlich, wenn ssh-add von einer .xsession oder einem verwandten Skript aufruft. (Beachten Sie, dass bei einigen Maschinen kann es notwendig sein die Eingabe umleiten von/dev/null, diese Arbeit zu machen.)

Als ich SSH_ASKPASS=file_with_passphrase ssh-add my_key ausführen ich noch ein Passwort eingeben zu können, fragte, sieht aus wie env var gerade ist ignoriert in diesem Fall. Ich habe versucht, ssh -o BatchMode=yes auszuführen und der Server hat nur den codierten Schlüssel zurückgewiesen, weil niemand in der Lage war, ihn zu entschlüsseln.

Ich kann definitiv ssh Schlüssel manuell vor der Verwendung in ssh-agent dekodieren, aber es sieht aus wie ich bin, um zu bekommen, was ich brauche von SSH_ASKPASS Variable, aber ich weiß nicht, wie es funktioniert. Ich freue mich, Hilfe von der Gemeinde zu bekommen.

+0

Sie sagen, 'Wenn ich SSH_ASKPASS execute = file_with_passphrase ssh-add my_key ich noch gefragt Geben Sie eine Passphrase ein "- aber das ist nicht wirklich, was die Manpage sagt - die Datei muss ausführbar sein und das Passwort auf stdout ausgeben - also sollte es etwa so aussehen: echo echo 'your_password'">/tmp/unsafe; chmod + x/tmp/unsicher; SSH_ASKPASS =/tmp/unsafe ssh-hinzufügen my_key'. Als ein Beispiel für etwas, das in 'SSH_ASKPASS' verwendet werden kann, siehe' x11-ssh-askpass' Befehl - Sie können seine Manpage auschecken und sie auch ausführen, um zu sehen, wie sie sich verhält. –

+0

@IwanAucamp Oh danke, missverstanden, machte ein Skript statt Datei. Und es hat nicht geholfen btw –

Antwort

3

So gibt es tatsächlich ein paar Dinge, die für wichtig ist, was Sie zu tun versuchen:

  1. DISPLAY muss muss
  2. es eingestellt werden, kein Terminal mit ihm verbunden haben auf einigen Maschinen
  3. Es kann notwendig sein, die Eingabe von/dev/null umzuleiten (meins ist einer von ihnen).
  4. SSH_ASKPASS muss eine ausführbare Datei enthalten, die die Passphrase unter stdout ausgibt.

So zum Beispiel bekommen es (für mich, sollte auch ich denke, auf anderen Linux arbeiten) zu arbeiten:

Dummy-Schlüssel erstellen:

ssh-keygen -t rsa -C se-so-38354773 -f /tmp/se-so-38354773.key -N 'se-so-38354773-pp' 

askpass Skript Passwort Echo erstellen Dateien:

cat > /tmp/se-so-38354773-askpass <<EOF 
#!/usr/bin/env bash 
echo "${0}:${@} : this is for debugging to see if the echo script runs" 1>&2 
echo "se-so-38354773-pp" 
EOF 
chmod +x /tmp/se-so-38354773-askpass 

legte ich diese Datei in/tmp/- aber das ist nicht gut für die Sicherheit ein, wenn Sie auch Berechtigungen für die Datei b ändern Vor dem Schreiben, um sicherzustellen, dass niemand es lesen kann (oder Umask setzen).

Dann können Sie tun ssh-add wie folgt:

DISPLAY=":0.0" SSH_ASKPASS="/tmp/se-so-38354773-askpass" setsid ssh-add /tmp/se-so-38354773.key </dev/null 

Die setsid distanziert sie von Ihrem Terminal, wenn es einen gibt - das ist allerdings nicht auf meinem Computer benötigt - aber ja - ich glaube, es kann sein, in einigen anderen Kontexten benötigt.

Und wenn man Tests durchgeführt werden kann aufzuräumen:

ssh-add -d /tmp/se-so-38354773.key 
rm /tmp/se-so-38354773* 

Beispiel Ausgabe auf meinem Computer:

[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ ssh-keygen -t rsa -C se-so-38354773 -f /tmp/se-so-38354773.key -N 'se-so-38354773-pp' 
Generating public/private rsa key pair. 
Your identification has been saved in /tmp/se-so-38354773.key. 
Your public key has been saved in /tmp/se-so-38354773.key.pub. 
The key fingerprint is: 
SHA256:s+jVUPEyb2DzRM5y+Hm3XDzVRREKn5yU2d0hk61hIQ0 se-so-38354773 
The key's randomart image is: 
+---[RSA 2048]----+ 
|   .E+=B=O| 
|   B*B*o=| 
|   X B*o o| 
|   o % o ..| 
|  S * ..+| 
|  . = . ...+| 
|  . o . o | 
|  . .   | 
|  .   | 
+----[SHA256]-----+ 
[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ 
[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ cat > /tmp/se-so-38354773-askpass <<EOF 
> #!/usr/bin/env bash 
> echo "${0}:${@} : this is for debugging to see if the echo script runs" 1>&2 
> echo "se-so-38354773-pp" 
> EOF 
[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ chmod +x /tmp/se-so-38354773-askpass 
[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ 
[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ DISPLAY=":0.0" SSH_ASKPASS="/tmp/se-so-38354773-askpass" setsid ssh-add /tmp/se-so-38354773.key </dev/null 
[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ 
bash: : this is for debugging to see if the echo script runs 
Identity added: /tmp/se-so-38354773.key (/tmp/se-so-38354773.key) 
[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ ssh-add -d /tmp/se-so-38354773.key 
Identity removed: /tmp/se-so-38354773.key (se-so-38354773) 
[email protected]:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773 
$ rm /tmp/se-so-38354773* 
+0

'user @ imnc: ~/Code/Sandbox $ chmod + x passphrase.sh' 'Benutzer @ imnc: ~/Code/Sandbox $ DISPLAY =": 0.0 "SSH_ASKPASS =./Passphrase .sh setsid ssh-add encrypted_key' 'Geben Sie die Passphrase für encrypted_key ein:' Keine Ahnung warum, aber ich werde immer noch aufgefordert, eine Passphrase einzugeben. Hat auch nicht funktioniert –

+1

Oh, tut mir leid, verpasst Dev/Null-Umleitung, es funktioniert tatsächlich. Vielen Dank –

+1

Es scheint zu schwierig, um so einfache Anforderung zu erreichen und auch unsicher als Hölle. Ich frage mich, wie Menschen ein solches Problem lösen. –