web-dev-qa-db-fra.com

Comment faire la phrase secrète de lecture ssh-add à partir d'un fichier?

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?

26
Satish

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

32
enrico.bacis

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"

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.

9
kenorb

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.

6
Ray Shannon