Ssh-keygen automatisé sans phrase secrète, comment?

86

J'aimerais créer un script automatisé qui appelle ssh-keygenet crée des paires de clés publiques / privées que j'utiliserai plus tard. En principe, tout fonctionne bien avec ...
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
... sauf que cela me demande la phrase secrète qui chiffrerait les clés. Cela rend difficile l'automatisation.

Je pourrais fournir une phrase secrète via l'argument de ligne de commande -N thepassphrase, afin d'éviter que l'invite n'apparaisse. Malgré tout, je ne souhaite même pas que les clés - en plus sécurisées par un cryptage - et que les paires de clés soient en texte clair.

Quelle est la meilleure solution à ce problème?

L' -qoption supposée signifier "calme / silencieux" n'évite toujours pas l'interaction phrase secrète. Aussi je n'ai pas trouvé quelque chose comme ça
ssh-keygen ...... -q --no-passphrase

S'il vous plait, ne commencez pas à prêcher et ne faites pas la leçon aux avantages et inconvénients de la "phrase secrète manquante", j'en suis conscient. Dans le formulaire interactif (pas en tant que script), l'utilisateur peut simplement appuyer sur [ENTRER] deux fois et la clé sera sauvegardée en texte brut. C'est ce que je veux réaliser dans un script comme celui-ci:

#! / bin / bash

commande1
commande2
var = $ (commande3)

# cela ne devrait pas arrêter le script et demander un mot de passe
ssh-kegen -b 2048 -t rsa -f / tmp / sshkey -q

humanitéet paix
la source

Réponses:

105

Cela empêchera l'invite de phrase secrète d'apparaître et configurera la paire de clés pour qu'elle soit stockée en texte brut (ce qui bien sûr comporte tous les inconvénients et risques de cela):

ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N ""
humanitéet paix
la source
3
Cela marche. Dans le cas où il /tmp/sshkeyexiste déjà, un message d’écrasement apparaît. Cela peut être empêché en redirigeant / fermant stdin - par exemple en ajoutant 0>&-.
maxschlepzig
34

La façon la plus simple que j'ai trouvée de faire ce que vous voulez est la suivante (exemple avec le nom de fichier par défaut)

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

Si le ~/.ssh/id_rsafichier existe déjà, la commande se fermera sans rien modifier.

Sinon, vous obtenez une nouvelle clé, dans ce nom de fichier.

Quoi qu'il en soit, vous n'avez rien écrasé et vous savez qu'à la fin, vous avez une clé.

JoaoCC
la source
confirmé: le 14.04.2 sur lubuntu
user77115
Si vous le voulez vraiment silencieux, dirigez la sortie vers / dev / null:cat /dev/zero | ssh-keygen -q -N "" > /dev/null
Chris Gregg
Sur (certes antique) SLES 11, la commande ci-dessus ne produit pas de clé. yes "" | ssh-keygen -N "" >&- 2>&-Cependant, fonctionne parfaitement et ne génère rien (qu’il existe ou non un fichier de clé) et n’écrase pas un fichier de clé existant auparavant.
Zrajm
Vérifié sur Ubuntu trusty (14.04)
Binita Bharati
2
Pourquoi est-ce que tu chat / dev / zéro?
maxschlepzig
9

Cela a fonctionné pour moi:

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

Le -Pest l'option de phrase secrète, et ""est la phrase secrète vide.

gowrish
la source
key_save_private: Aucun fichier ou répertoire de ce type
Dimitri Kopriwa
5
L' -P <passphrase>option consiste à fournir le (ancien) mot de passe. linux.die.net/man/1/ssh-keygen
Gianfranco P. le
5

Vous pouvez utiliser s'attendre à envoyer le "entrer" pour vous

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

Sachez toutefois que si le fichier / tmp / sshkey existe déjà, il échouera car le résultat de la commande sera différent.

BitsOfNix
la source
1
Merci pour votre contribution. l'attente semble même plus polyvalente pour des problèmes du même genre ... ainsi que pour ceux où script et interaction utilisateur seraient en conflit. Je serai conscient de la confusion potentielle que / tmp / sshkey existe déjà et le vérifier avant d'utiliser votre commande.
humanityANDpeace
2

J'ai fait un simple écho avant ssh-keygen. Alorssu - <user> -c "echo |ssh-keygen -t rsa"

Cela a été testé sur Redhat 6

Koopsj
la source
Je ne pense pas que ce soit la meilleure réponse, mais je pense qu’il n’ya aucune raison de faire baisser le vote non plus, les gars.
Cubuspl42
0

Pour un autre utilisateur, testé sur Ubuntu 18.04:

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