Automatisiertes ssh-keygen ohne Passphrase, wie?

86

Ich möchte ein automatisiertes Skript ssh-keygenerstellen, das einige Pub / Private-Schlüsselpaare aufruft und erstellt, die ich später verwenden werde. Im Prinzip funktioniert alles einwandfrei mit ...
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
... außer dass ich nach der Passphrase gefragt werde, die die Schlüssel verschlüsseln würde. Dies erschwert die Automatisierung.

Ich könnte eine Passphrase über das Befehlszeilenargument bereitstellen -N thepassphrase, damit die Eingabeaufforderung nicht angezeigt wird. Trotzdem möchte ich nicht einmal die Schlüssel - zusätzlich durch Verschlüsselung gesichert - haben und möchte , dass die Schlüsselpaare Klartext sind.

Was ist eine (beste) Lösung für dieses Problem?

Die -qOption, die angeblich "leise / still" bedeutet, vermeidet die Interaktion mit der Passphrase immer noch nicht. Auch so etwas habe ich nicht gefunden
ssh-keygen ...... -q --no-passphrase

Bitte fangen Sie nicht an, über das Für und Wider der "fehlenden Passphrase" zu predigen oder mich zu belehren, mir ist das bewusst. In der interaktiven Form (nicht als Skript) kann der Benutzer einfach zweimal [ENTER] drücken und der Schlüssel wird als Klartext gespeichert. Folgendes möchte ich in einem Skript wie diesem erreichen:

#! / bin / bash

befehl1
befehl2
var = $ (command3)

# Dies sollte das Skript nicht stoppen und nach dem Passwort fragen
ssh-kegen -b 2048 -t rsa -f / tmp / sshkey -q

Mensch und Frieden
quelle

Antworten:

105

Dies verhindert, dass die Aufforderung zur Eingabe der Passphrase angezeigt wird, und legt fest, dass das Schlüsselpaar im Klartext gespeichert wird (was natürlich alle Nachteile und Risiken mit sich bringt):

ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N ""
Mensch und Frieden
quelle
3
Das funktioniert. Falls /tmp/sshkeybereits vorhanden, wird eine Aufforderung zum Überschreiben angezeigt. Dies kann durch Umleiten / Schließen von stdin - zB durch Hinzufügen - verhindert werden 0>&-.
Maxschlepzig
34

Der einfachste Weg, den ich gefunden habe, um das zu tun, was Sie wollen, ist der folgende (Beispiel mit dem Standarddateinamen)

    cat /dev/zero | ssh-keygen -q -N ""

Wenn die ~/.ssh/id_rsaDatei bereits vorhanden ist, wird der Befehl ohne Änderung beendet.

Wenn nicht, erhalten Sie einen brandneuen Schlüssel in diesem Dateinamen.

In jedem Fall haben Sie nichts überschrieben und am Ende wissen Sie, dass Sie einen Schlüssel haben.

JoaoCC
quelle
bestätigt: am lubuntu 14.04.2
user77115 15.03.15
Wenn Sie es wirklich ruhig haben möchten, leiten Sie die Ausgabe an / dev / null weiter:cat /dev/zero | ssh-keygen -q -N "" > /dev/null
Chris Gregg
Auf (zugegebenermaßen antiken) SLES 11 kann der obige Befehl keinen Schlüssel erzeugen. yes "" | ssh-keygen -N "" >&- 2>&-Funktioniert jedoch einwandfrei und gibt nichts aus (unabhängig davon, ob bereits eine Schlüsseldatei vorhanden ist oder nicht) und überschreibt keine zuvor vorhandene Schlüsseldatei.
Zrajm
Verifiziert auf Ubuntu Trusty (14.04)
Binita Bharati
2
Warum hast du cat / dev / zero?
Maxschlepzig
9

Das hat bei mir funktioniert:

ssh-keygen -t rsa -f /home/oracle/.ssh/id_rsa -q -P ""

Das -Pist die Passwort - Option und ""ist das leere Passwort.

Gowrish
quelle
key_save_private: Keine solche Datei oder Verzeichnis
Dimitri Kopriwa
5
Sie können -P <passphrase>auch die (alte) Passphrase eingeben. linux.die.net/man/1/ssh-keygen
Gianfranco P.
5

Sie können erwarten, die "Enter" für Sie zu senden

cat test.sh
#!/bin/bash
set -x
XYZ=$(expect -c "
spawn ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
expect \"Enter passphrase (empty for no passphrase):\"
send \"\r\"
expect \"Enter same passphrase again:\"
send \"\r\"
")

Beachten Sie jedoch, dass die Datei / tmp / sshkey fehlschlägt, wenn sie bereits vorhanden ist, da sich die Ausgabe des Befehls unterscheidet.

BitsOfNix
quelle
1
danke für den beitrag. Die Erwartung scheint für Probleme der gleichen Art noch vielseitiger zu sein. Ich bin mir des möglichen Konflikts bewusst, dass / tmp / sshkey bereits vorhanden ist, und überprüfe dies, bevor Sie Ihren Befehl verwenden.
HumanityANDpeace
2

Ich habe ein einfaches Echo vor ssh-keygen gemacht. Damitsu - <user> -c "echo |ssh-keygen -t rsa"

Dies wurde auf Redhat 6 getestet

koopsj
quelle
Ich denke nicht, dass dies die beste Antwort ist, aber ich denke, dass es auch keinen Grund gibt, eine Ablehnung herbeizuführen, Jungs.
Cubuspl42
0

Für einen anderen Benutzer, der unter Ubuntu 18.04 getestet wurde:

sudo -u username bash -c "ssh-keygen -f /tmp/sshkey -N ''"
Jeroen Vermeulen - MageHost
quelle