Keine der Antworten tut genau das, was erwartet wird. Das gewünschte Verhalten:Führen Sie ssh-keygen mit Standardeinstellungen aus (als ob wir gerade Enter gespammt hätten), ohne jemals zur Eingabe aufzufordern.
Der auszuführende Befehl lautet:
yes '' | ssh-keygen -N '' > /dev/null
Lassen Sie>/dev/null weg, wenn Sie die Ausgabe drucken möchten.
Erläuterung:
yes y
spams 'y', was ssh-keygen wörtlich nimmt und die Schlüssel in $PWD/y und $PWD/y.pub erstellt. yes ''
spammt leere Zeilen (Enter), was wir wollen. Die Angabe der Datei mit -f ~/.ssh/id_rsa schlägt fehl, wenn das Verzeichnis .ssh nicht existiert. Die Option -t rsa ist nicht erforderlich, wenn rsa der Standardtyp ist (wir spammen sowieso enter). Die Passphrase wird nicht von stdin gelesen (auf der wir Spam eingeben), sondern direkt von der Tastatur, sodass nichts sie abfangen kann. Aus diesem Grund müssen Sie -N '' für leere Passphrase angeben.
Für mich musste ich eine Kombination aus @Lukasz-Antwort und @Juan-Antwort verwenden, wenn ich den ssh-Befehl verwendete
ssh -p$SSH_PORT -q [email protected]$INSTANCE_IP 'yes y | ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa'
Wenn Sie den Benutzer nicht nach einer Datei fragen möchten, in der der Schlüssel gespeichert werden soll, können Sie das Dateiausgabe-Flag -f
hinzufügen zum Befehl.
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
Auf diese Weise wird der Benutzer zu keiner Eingabe aufgefordert, es sei denn id_rsa Datei(en) existieren bereits.
Wir müssen zwei Schritte ausführen automatisch:
-
Geben Sie eine Passphrase ein . Verwenden Sie die
-N
Flag (ungültiger String für dieses Beispiel):ssh-keygen -t rsa -N ''
-
Schlüsseldatei überschreiben :
Verwenden Sie -f
um den Pfad einzugeben (in diesem Beispiel id_rsa
) plus eine hier-Zeichenfolge mit Ja zu beantworten auf folgende Frage:
ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y >/dev/null 2>&1
Oder unter einem bash
wie Shell, wenn Sie auf jeden Fall die vorherige überschreiben möchten , verwenden Sie einfach einen hier-String um den Befehl zu geben mit allem nötigen Input :
ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1
Ab ssh-keygen
Mann Seite:
-N new_passphrase provides the new passphrase. -q silence ssh-keygen. -f filename specifies the filename of the key file.
Schritt-für-Schritt-Erklärung
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/klashxx/.ssh/id_rsa):
1 ) Um die Eingabe des Schlüssels zu vermeiden, verwenden Sie -f
:
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
/home/klashxx/.ssh/id_rsa already exists.
Overwrite (y/n)?
ACHTUNG :Wenn Ihnen der RSA-Dateiname egal ist und Sie auf jeden Fall den vorherigen überschreiben möchten, lesen Sie die Anweisungen unter Punkt vier.
2 ) Jetzt müssen wir mit "y antworten " automatisch zur Frage überschreiben (verwenden wir einen hier-string für diesen Job):
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa <<< y
Generating public/private rsa key pair.
/home/klashxx/.ssh/id_rsa already exists.
Overwrite (y/n)? Enter passphrase (empty for no passphrase):
3 ) Schließlich werden wir den -N
verwenden Flag, um einen ungültigen Pass einzugeben:
$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< y
Generating public/private rsa key pair.
/home/klashxx/.ssh/id_rsa already exists.
Overwrite (y/n)? Your identification has been saved in /home/klashxx/.ssh/id_rsa.
Your public key has been saved in /home/klashxx/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Xo0t6caMB/8TSsigxfY28JIfqYjyqxRZrFrPncx5yiU [email protected]
The key's randomart image is:
+---[RSA 2048]----+
| |
| . |
| o . |
| + * = |
| +. + BSo= o |
|...o.+o+XO... |
|.. .o.E==+B. . |
|o . ...=.o... |
|.+o. o .. |
+----[SHA256]-----+
4 ) Zusätzlicher Ball , bereinigen Sie die Ausgabe, überprüfen Sie einfach den Rückgabecode:
$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y >/dev/null 2>&1
$ echo $?
0
Ein alternativer Pfad zum Überschreiben der vorherigen RSA-Datei (kein Flag -f erforderlich)
HINWEIS :Nur bash
wie Muscheln.
Wenn Ihnen der RSA-Name egal ist und Sie ihn nur überschreiben möchten, müssen wir diese beiden Fragen automatisch beantworten:
-
Geben Sie die Datei ein, in der der Schlüssel gespeichert werden soll:/Beispiel/Pfad/.ssh/id_rsa existiert bereits.
-
Überschreiben (j/n)?
Wenn wir das von Hand machen, müssen wir für die erste Frage nur Enter drücken , und geben Sie für die zweite y
ein und drücken Sie enter
.
Wir können diese Aktionen simulieren, indem wir den folgenden here-string verwenden :
$'\ny'
Aus dem bash
Manpage:
Wörter der Form $'string' werden besonders behandelt. Das Wort wird zu "String" erweitert, wobei Backslash-Escape-Zeichen gemäß den Vorgaben des ANSI-C-Standards ersetzt werden.
\n neue Zeile
Also, wenn wir od
verwenden um unseren String zu analysieren:
cat - <<< $'\ny' | od -c
0000000 \n y \n
Wir sehen, dass wir genau das bekommen, was wir brauchen, um die Fragen zu beantworten.
Die Punkte 1 und 2 lassen sich zusammenfassen :
ssh-keygen -q -t rsa <<< $'\ny'
Und der letzte Befehl wird sein:
$ ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1
$ echo $?
0
Vielen Dank
@lukasz-dynowski, @redochka, @mellow-yellow, @yeti und die anderen in diesem Thread.