SSH : sshpass, la connexion SSH par mot de passe non-interactive
Table des matières
Quand on se connecte à une machine en ssh (ou avec un transfert de fichiers avec rsync), 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.
Cependant, parfois, nous n'avons pas le choix et devons utiliser un mot de passe.
sshpass va nous permettre de nous connecter en ssh sans demande de mot de passe.
Il existe plusieurs solutions pour passer le mot de passe à ssh (ou rsync, ou sftp) 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 en faire un article dédié ici.
Nous allons voir ici comment l'utiliser !
Si le logiciel n'est pas installé, on l'installe :
Gentoo :
CentOS 8 (EPEL Requis) et Fedora :
CentOS 7 (EPEL Requis) :
Debian et Ubuntu :
La commande s'utilise avant ssh, rsync ou autre :
Pour passer en clair le mot de passe dans la commande, on utilisera l'option -p de sshpass.
Exemple avec une commande ssh :
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" :
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 avec une commande rsync :
Le transfert débute sans demande de mot de passe.
On peut évidemment effacer la variable après utilisation !
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 :
Comme la variable d'environnement, on peut supprimer le fichier après utilisation s'il ne sert pas à autre chose !
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 :
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) :
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 :
Introduction
Quand on se connecte à une machine en ssh (ou avec un transfert de fichiers avec rsync), 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.
Cependant, parfois, nous n'avons pas le choix et devons utiliser un mot de passe.
sshpass va nous permettre de nous connecter en ssh sans demande de mot de passe.
Il existe plusieurs solutions pour passer le mot de passe à ssh (ou rsync, ou sftp) 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 en faire un article dédié ici.
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
CentOS 8 (EPEL Requis) et Fedora :
Code BASH :
dnf install sshpass
CentOS 7 (EPEL Requis) :
Code BASH :
yum install sshpass
Debian et Ubuntu :
Code BASH :
apt install sshpass
Utilisation
Utilisation générale
La commande s'utilise avant ssh, rsync ou autre :
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 avec une commande rsync :
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
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