J'essaie d'ajouter une clé dans ssh-agent
et veux ssh-add
lire le mot de passe du fichier en utilisant. Comment c'est possible?
Comment automatiser ce processus à partir du script Shell?
Selon votre distribution et la version de ssh-add, vous pourrez ou non utiliser le -p
option de ssh-add qui lit la phrase secrète de stdin de cette façon:
cat passfile | ssh-add -p keyfile
Si cela ne fonctionne pas, vous pouvez utiliser Expect , un outil Unix pour rendre les applications interactives non interactives. Vous devrez l'installer depuis votre gestionnaire de paquets.
J'ai écrit un outil pour vous dans l'attente. Copiez simplement le contenu dans un fichier nommé ssh-add-pass et définissez les autorisations exécutables dessus (chmod +x ssh-add-pass
). Vous pouvez également le copier dans/usr/bin ou/usr/local/bin pour être accessible à partir de la recherche $ PATH.
#!/bin/bash
if [ $# -ne 2 ] ; then
echo "Usage: ssh-add-pass keyfile passfile"
exit 1
fi
eval $(ssh-agent)
pass=$(cat $2)
expect << EOF
spawn ssh-add $1
expect "Enter passphrase"
send "$pass\r"
expect eof
EOF
L'utilisation est simplement: ssh-add-pass keyfile passfile
Voici une solution de contournement pour les systèmes ne prenant pas en charge -p
:
$ PASS="my_passphrase"
$ install -vm700 <(echo "echo $PASS") "$PWD/ps.sh"
$ cat id_rsa | SSH_ASKPASS="$PWD/ps.sh" ssh-add - && rm -v "$PWD/ps.sh"
où ps.sh
est essentiellement votre script qui imprime votre phrase secrète. Voir: man ssh-add
.
Pour le rendre plus sécurisé (pour ne pas le conserver dans le même fichier), utilisez mktemp
pour générer un fichier privé aléatoire, rendez-le exécutable (chmod
) et assurez-vous qu'il imprime la phrase secrète au standard sortie une fois exécutée.
Similaire à la réponse de kenorb, mais ne sauvegarde pas le secret dans un fichier:
$ SSH_ASKPASS=/path/to/ssh_give_pass.sh ssh-add $KEYFILE <<< "$KEYPASS"
où ssh_give_pass.sh est:
#!/bin/bash
# Parameter $1 passed to the script is the Prompt text
# READ Secret from STDIN and echo it
read SECRET
echo $SECRET
Si vous avez votre secret dans un $ KEYPASSFILE, lisez-le d'abord dans une variable avec
KEYPASS=`cat $KEYPASSFILE`
Assurez-vous également que ssh_give_pass.sh n'est pas modifiable par des utilisateurs non autorisés - il sera facile de consigner tous les secrets transmis via le script.