Logiciels en ligne de commande

SSH : sshpass, la connexion SSH par mot de passe non-interactive

Table des matières

Introduction



Quand on se connecte à une machine en ssh (ou avec un transfert de fichiers avec rsync ou scp), il est nécessaire de taper son mot de passe.
Pour les scripts, j'utilise un couple de clé publique/privé. C'est la méthode à privilégier qui est bien plus robuste notamment en cas d'attaque de type brute-force.

Cependant, parfois, vous avez besoin d'un mot de passe. Si vous déployez pour la première fois des clés sur beaucoup de serveurs et qu'ils ont tous un mot de passe, cela vous permettra aussi d'accélérer le déploiement.

sshpass va nous permettre de nous connecter en ssh sans que la demande de mot de passe soit à saisir par l'utilisateur.

Il existe plusieurs solutions pour passer le mot de passe à ssh avec sshpass :
- variable d'environnement
- dans la ligne de commande
- dans un fichier

J'en ai rapidement parlé il y a un moment dans l'article https://www.linuxtricks.fr/wiki/ssh-commandes-sftp mais je souhaite faire un article dédié ici à cet utilitaire.

Nous allons voir ici comment l'utiliser !

Installation



Si le logiciel n'est pas installé, on l'installe :

Gentoo :
Code BASH :
emerge -av net-misc/sshpass


Red Hat Enterprise Linux (et dérivées) et Fedora :
Code BASH :
dnf install sshpass


Debian et Ubuntu :
Code BASH :
apt install sshpass


Utilisation



Utilisation générale



La commande s'utilise avant ssh ou autres outils reposant sur ssh tels que rsync ou sftp par exemple :

Code BASH :
sshpass [options] commande paramètres


Passer dans la ligne de commande le mot de passe



Pour passer en clair le mot de passe dans la commande, on utilisera l'option -p de sshpass.

Exemple avec une commande ssh :
Code BASH :
sshpass -p monmotdepassecostaud ssh adrien@192.168.21.100


Nous sommes directement connecté !

Il est nécessaire de bien sécuriser le script concerné (ne permettre en lecture que pour l'utilisateur) !!
A noter, les autres utilisateurs ne voient pas le mot de passe avec la commande ps -ef sur la machine, il est masqué avec des "zzz" :

Code BASH :
adrien   31966  6204  0 11:27 pts/0    00:00:00 sshpass -p zzzzzzz ssh adrien@192.168.21.100


Utiliser une variable d'environnement



Plutôt que de passer le mot de passe dans la ligne de commande, on peut utiliser la variable "SSHPASS" et stocker dedans le mot de passe ! On utilisera alors l'option -e de sshpass.

Exemple ici avec une commande rsync (qui utilise par défaut SSH lors d'une copie distante) :
Code BASH :
export SSHPASS="monmotdepassecostaud"
sshpass -e rsync -avzh /tmp/ adrien@192.168.21.100:/home/adrien/tmp/


Le transfert débute sans demande de mot de passe.
On peut évidemment effacer la variable après utilisation !

Code BASH :
unset SSHPASS


Utiliser un fichier où le mot de passe est stocké



On peut aussi utiliser un fichier si on le souhaite, je n'en vois pas l'utilité en pratique.
Peut être si vous avez plusieurs scripts dans plusieurs langages ? Ou des caractères bizarres dans votre mot de passe qui empêche l'utilisation en ligne de commande / variable d'environnement ?

Le mot de passe lu sera la première ligne du fichier, sans le saut de ligne.

Exemple avec une commande ssh :
Code BASH :
echo monmotdepassecostaud > $HOME/mdpsshpass
sshpass -f /root/mdpsshpass ssh adrien@192.168.21.100


Comme la variable d'environnement, on peut supprimer le fichier après utilisation s'il ne sert pas à autre chose !

Code BASH :
rm $HOME/mdpsshpass


D'autres méthodes ...



L'outil permet aussi d'utiliser d'autres méthodes, mais je n'en vois pas l'intérêt, comme l'utilisation d'un file descriptor, ou de définir à nouveau un prompt de mot de passe.

Dans tous les cas, n'oubliez pas, pour toute la documentation de l'outil :

Code BASH :
man sshpass


Cas pratique sur retour d'expérience



sshpass dans une boucle BASH



Si vous faites un script avec un while qui prend une liste dans un txt (ici je passe le mdp avec l'option -p pour vous illustrer) :

Code BASH :
while read srv
do
      sshpass -p password ssh user@$srv cat /etc/redhat-release
done < liste-server.txt


La boucle va :
- s'arrêter au premier serveur
- la liste des serveurs sur lesquels vous ne vous êtes pas connectés demandent de valider l'emprunte

Pour cela on va respectivement :
- utiliser l'option -n pour ne pas lire depuis l'entrée standard
- utiliser l'option StrictHostKeyChecking

Ce qui donne :

Code BASH :
while read srv
do
      sshpass -p password ssh -n -o StrictHostKeyChecking=no user@$srv cat /etc/redhat-release
done < liste-server.txt


:magic:
Cette page a été vue 52461 fois