30 Stimmen

ssh-keygen akzeptiert stdin

Ich versuche zu telefonieren ssh-keygen unter Verwendung einer Variablen durch bash als Eingabe anstelle einer Datei, um einen Fingerabdruck eines öffentlichen Schlüssels zu erhalten. Ich bin mir bewusst, dass ich eine temporäre Datei verwenden könnte, um dieses Problem zu umgehen, aber aus Gründen, die nicht in den Rahmen dieser Frage fallen, möchte ich das nicht.

Diese Methode ist no funktionieren, da die Schlüsseldatei als ungültig eingestuft wird (sie ist mit Sicherheit korrekt)

echo $pubkey | ssh-keygen -lf /dev/stdin

この hace funktioniert, aber nicht mit einer Variablen, sondern mit einer Datei.

ssh-keygen -lf alpha.pub

この hace funktioniert, aber nicht mit einer Variablen, sondern mit einer umgeleiteten Datei.

ssh-keygen -lf /dev/stdin < alpha.pub

Dies bedeutet no funktionieren, weil ich eine zweideutige Umleitung erhalte

ssh-keygen -lf /dev/stdin < $(echo $pubkey)

Ich würde gerne wissen, wie ich ssh-keygen dazu bringe, aus einer Variable mit einem öffentlichen Schlüssel zu lesen, und wenn möglich, eine Erklärung, warum die Umleitungen nicht das tun, was ich denke, dass sie tun sollten. Genauer gesagt, warum die | verhält sich anders als der < und warum das dritte Beispiel ein ambiguous redirect . Ich habe im Internet gesucht, aber viele der Umleitungs-Tutorials scheinen meine Fragen nicht zu beantworten.

21voto

Jürgen Hötzel Punkte 17196
echo $pubkey | ssh-keygen -lf /dev/stdin
/dev/stdin is not a public key file.

/dev/stdin ist eigentlich eine Unix-Pipe, keine normale Datei, daher kann ssh-keygen die Datei nicht öffnen

ssh-keygen -lf /dev/stdin  <<<$key
1024 92:6a:3f:5c:1f:78:.....

/dev/stdin bezieht sich auf eine reguläre Datei, die mit einem Bash heredoc erstellt wurde. Sie können dies überprüfen:

# ls -l /dev/stdin <<<$pubkey
lrwxrwxrwx 1 root root 15 Feb 11 08:07 /dev/stdin -> /proc/self/fd/0
# ls -l /proc/self/fd/0 <<<$pubkey
lr-x------ 1 juergen juergen 64 Apr 14 13:31 /proc/self/fd/0 -> /tmp/sh-thd-1271250023 (deleted)

2 Stimmen

Auf Ubuntu 14.04, Bash 4.3.11, Kernel 3.13.0-24-generic, funktioniert dies nicht und meldet /dev/stdin: Stale file handle .

20voto

Jan Fabry Punkte 6892

Seit Version 7.2 (veröffentlicht am 2016-02-28) ist dies nun möglich, indem man - als Dateiname. Aus den Versionshinweisen:

  • ssh-keygen(1): Erlaubt das Erstellen von Fingerabdrücken von der Standardeingabe, z.B. ssh-keygen -lf -

3 Stimmen

Mit der Veröffentlichung von OpenSSH 7.2 sollte dies nun die akzeptierte Antwort sein. Also echo $pubkey | ssh-keygen -lf - oder ähnliches, ist jetzt der richtige Weg.

5voto

htaccess Punkte 2144

Hier ist ein Einzeiler, der die Datei verwendet /dev/stdin wie in anderen Antworten beschrieben.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Beachten Sie, dass dies bei privaten Schlüsseln, die eine Passphrase verwenden, nicht funktioniert. Es funktioniert mit pem-Dateien, die von AWS oder OpenStack generiert wurden und keine Passphrasen verwenden.

4voto

tylerl Punkte 29162

Wenn Sie eine Zeichenkette als stdin umleiten wollen, verwenden Sie diese Syntax:

cmd <<< "some $STR here"

Wenn Sie die Ausgabe eines Befehls so umleiten wollen, als wäre sie eine Datei, gehen Sie folgendermaßen vor:

cmd <( /bin/somecmd )

Und wenn Sie einen Befehl als OUTPUT-Datei verwenden wollen, ist es mehr oder weniger dasselbe:

cmd >( /bin/othercmd )

3 Stimmen

Also ssh-keygen -lf /dev/stdin <<< "$pubkey" wird dann wahrscheinlich das tun, was der Auftraggeber wünscht.

-2voto

The Monster Punkte 1

Ich würde empfehlen, eine temporäre Datei zu verwenden. Das Problem ist, dass BASH beim Umleiten eine Datei erwartet. Wenn Sie $(echo $pubkey) verwenden, wird sich die Bash beschweren, weil sie nach der Ersetzung nach einer Datei mit diesem Namen sucht, die durch die Ersetzung erstellt wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X