Lass ssh-add ruhig sein, wenn key schon da ist

16

Ich möchte ganz ssh-add /path/to/special_keyoben in ein Skript schreiben. Dies funktioniert einwandfrei, fordert jedoch immer zur Eingabe der Passphrase auf. Dies ist seltsam und ein wenig ärgerlich, da immer noch nach der Passphrase gefragt wird, auch wenn ssh-add -lder Schlüssel bereits hinzugefügt wurde.

Gibt es eine Möglichkeit, dies mitzuteilen: "Fügen Sie diesen Schlüssel hinzu und fragen Sie nach der Passphrase, falls sie noch nicht hinzugefügt wurde, andernfalls tun Sie nichts"?

Darren Cook
quelle
Ähnliche Frage bei superuser.com/q/325662
Darren Cook

Antworten:

20

Ich sehe keine Optionen für ssh-add, die zum Erreichen des gewünschten Ergebnisses beitragen, aber es ist ziemlich einfach, dies zu umgehen, da Sie sich insbesondere mit einem Schlüssel befassen.

Nimm zuerst den Fingerabdruck für deinen special_key:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

Nehmen wir an, dieser Fingerabdruck sieht aus wie 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

ssh-add -lÜberprüfen Sie dann oben in Ihrem Skript, ob dieser Schlüssel geladen ist, bevor Sie zum Hinzufügen aufgefordert werden:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

Sie können dies alles in einer Zeile zusammenfalten, wenn Sie möchten:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key
Lars Rohrbach
quelle
Der Einzeiler funktioniert gut, danke!
Darren Cook
1
Ich halte diesen vereinfachten Einzeiler für ein wenig verständlicher und vorzuziehen, da er vermeidet ssh-keygen(schließlich möchte ich keine Schlüssel generieren), und benutze stattdessen den Schlüsselpfad:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus
1
ssh-keygenIn der Antwort wird kein Schlüssel generiert - wie ssh-add -lin Ihrem Beispiel wird tatsächlich nichts hinzugefügt. Flags ändern das Verhalten der Befehle, sodass es nicht genau mit dem Namen übereinstimmt. Beachten Sie, dass sich diese Versionen funktional unterscheiden. Wenn sich die Überprüfung anhand des Pfads und des Schlüssels an diesem Pfad ändert, wird sie von Ihrer Version nicht erfasst. Die Version in der Antwort würde auch vorhandene Schlüssel erkennen, unabhängig davon, von wo sie geladen wurden.
Richlv
5

Es gibt keine direkte Möglichkeit, nur mithilfe von zu überprüfen, ssh-addaber Sie können ssh-keygeneinige Skripts zum Überprüfen verwenden.

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

Das Obige würde dann gedruckt, yeswenn der durch die Datei dargestellte Fingerabdruck /path/to/special_keyin ssh-add -lder Ausgabe vorhanden wäre.

Beispiel

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

Wo der Inhalt der Ausgabe von so ssh-keygen -lf /path/to/special_keyaussieht:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

Und wir verwenden awk {print $ 2}, um nur die 2. Spalte auszuwählen, die den Fingerabdruck enthält, dh:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

Verweise

slm
quelle
3

Möglicherweise haben Sie bestimmte Gründe für die ssh-addexplizite Verwendung. Wenn Sie jedoch nur möchten, dass Sie bei der ersten Verwendung des Schlüssels zur Eingabe Ihrer Passphrase aufgefordert werden, jedoch nicht danach, hat openssh eine einfachere Lösung:

Tragen Sie AddKeysToAgent yesIhre .ssh/configAkte ein.

Nate
quelle
Vielen Dank. Das wurde anscheinend in ssh 7.2 hinzugefügt (Ubuntu 18 scheint auf Version 7.6 zu sein).
Darren Cook
Ja, "AddKeysToAgent wird von meiner openssh-Version nicht unterstützt" ist ein guter Grund, ssh-add explizit zu verwenden ;-)
Nate
0

ssh-add -K FILEfunktionierte gut für mich auf dem Mac.
Es werden weiterhin die Zeilen "Identität hinzugefügt:" angezeigt, es wird jedoch keine Passphrase abgefragt.

Aus der Manpage:

-K Beim Hinzufügen von Identitäten wird jede Passphrase auch im Schlüsselbund des Benutzers gespeichert. Wenn Sie Identitäten mit -d entfernen, wird jede Passphrase daraus entfernt.

Ivan
quelle