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

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 ""

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.


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


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.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.