Recherche de site Web

Utiliser sshpass pour une connexion SSH non interactive dans les scripts


Dans ce guide, nous apprendrons ce qu'est l'utilitaire sshpass, comment installer sshpass sur les systèmes Linux et FreeBSD, et comment utiliser sshpass pour une connexion SSH non interactive dans les scripts shell sous Linux et Unix.

Introduction

En tant qu'administrateur système Linux, vous pouvez avoir besoin d'accéder à des machines distantes et de transférer des fichiers entre elles plusieurs fois par jour. Une façon d'accéder à un système distant est ssh. Les deux méthodes d'authentification SSH les plus couramment utilisées sont la méthode basée sur le mot de passe et la méthode d'authentification par clé.

Dans la méthode d'authentification basée sur le mot de passe, les utilisateurs doivent saisir manuellement le mot de passe à chaque fois qu'ils s'authentifient sur un système distant. Cette méthode est un peu fastidieuse et n'est pas non plus adaptée à l'automatisation de tâches via des scripts. En effet, l'utilisateur doit toujours saisir manuellement le mot de passe à chaque fois. Donc, si vous souhaitez implémenter l'authentification SSH basée sur un mot de passe dans des scripts, vous pouvez essayer l'utilitaire en ligne de commande sshpass.

Qu'est-ce que sshpass ?

L'utilitaire sshpass est conçu pour exécuter ssh en utilisant le mode d'authentification par mot de passe interactif au clavier, mais de manière non interactive. Pour le dire simplement - sshpass offre un moyen non interactif pour authentifier une session SSH.

SSH utilise un accès direct au TTY pour s'assurer que le mot de passe est bien fourni par un utilisateur avec un clavier interactif. Sshpass exécute ssh dans un TTY dédié, le trompant en lui faisant croire qu'il reçoit le mot de passe d'un utilisateur interactif.

Installer sshpass sur Linux

L'utilitaire sshpass est disponible dans les dépôts par défaut de nombreuses distributions Linux. Par exemple, vous pouvez utiliser la commande suivante pour installer sshpass sur Arch Linux et ses variantes telles qu'EndeavourOS et Manjaro Linux :

$ sudo pacman -S sshpass

Installer sshpass sur Debian, Ubuntu et ses dérivés :

$ sudo apt install sshpass

Installer sshpass sur Fedora, RHEL, CentOS, AlmaLinux et Rocky Linux :

$ sudo dnf install sshpass

Installer sshpass sur openSUSE :

$ sudo zypper install sshpass

Pour installer sshpass sur FreeBSD, exécutez les commandes suivantes en tant qu'utilisateur root :

# cd /usr/ports/security/sshpass/ && make install clean
# pkg install sshpass

Un mot de prudence : Toutes ces méthodes sont très peu sûres. Tous les utilisateurs du système peuvent voir le mot de passe dans les commandes simplement en exécutant la commande ps. Il est FORTEMENT DÉCONSEILLÉ d'utiliser ces méthodes en production. Il est préférable d'utiliser l'authentification SSH par clé à la place.

Utilisez sshpass pour une connexion SSH non interactive

Prenons quelques exemples pour comprendre comment nous pouvons utiliser sshpass pour une connexion SSH non interactive, c'est-à-dire sans taper le mot de passe SSH.

Exemple 1 - Se connecter à des systèmes distants via ssh en utilisant sshpass

Le sshpass peut accepter le mot de passe comme argument, ou lire le mot de passe via une variable d'environnement, ou lire le mot de passe à partir d'un fichier texte.

Voyons des exemples pour chaque méthode.

Fournir le mot de passe comme argument

Pour fournir le mot de passe en tant qu'argument, utilisez l'option -p comme ci-dessous.

$ sshpass -p <remote-password> ssh remoteuser@ip-address

Exemple :

$ sshpass -p almalinux ssh ostechnix@192.168.1.20

Ici,

  • -p almalinux - Fournit le mot de passe (c'est-à-dire ubuntu) pour le système distant.
  • ostechnix@192.168.1.20 - Nom d'utilisateur distant et adresse IP.

Exemple de sortie :

Last login: Tue Oct 11 12:33:20 2022 from 192.168.1.101
[ostechnix@Almalinux8CT ~]$ 

Utilisez sshpass pour une connexion SSH non interactive

Vous pouvez également exécuter des commandes sur le système distant sans vous y connecter réellement.

$ sshpass -p almalinux ssh ostechnix@192.168.1.20 uname -a

Lisez le guide suivant pour en savoir plus sur la façon d'exécuter des commandes sur un système Linux à distance via SSH.

  • Exécuter des commandes sur des systèmes Linux distants via SSH

Fournir le mot de passe comme variable d'environnement

Dans cette méthode, nous déclarons une variable d'environnement appelée SSHPASS avec le mot de passe du système distant comme valeur. C'est un peu mieux que de fournir directement le mot de passe comme argument.

Tout d'abord, utilisez la commande export pour enregistrer le mot de passe dans une variable d'environnement appelée SSHPASS comme ci-dessous :

$ export SSHPASS=almalinux

Et ensuite, nous fournissons le mot de passe avec le drapeau -e comme ci-dessous :

$ sshpass -e ssh ostechnix@192.168.1.20

Vous pouvez également combiner les deux commandes et les exécuter comme une seule commande comme ci-dessous.

$ SSHPASS=almalinux sshpass -e ssh ostechnix@192.168.1.20

Cette méthode expose également le mot de passe au fichier d'historique et tous les utilisateurs peuvent le voir en utilisant la commande history. Pour protéger les utilisateurs de la visualisation du mot de passe, il suffit de vider l'historique bash.

Lire le mot de passe à partir d'un fichier texte

Ajoutez le mot de passe dans un fichier texte appelé mypassword.txt avec la commande echo :

$ echo "almalinux" > mypassword.txt

Sécurisez le fichier de mot de passe en utilisant la commande chmod :

$ chmod 0400 mypassword.txt

Maintenant, passez le fichier de mot de passe à sshpass avec l'option -f comme ci-dessous :

$ sshpass -f mypassword.txt ssh ostechnix@192.168.1.20

Chiffrer le fichier de mot de passe en utilisant gpg

Dans l'exemple précédent, nous avons enregistré le mot de passe dans un fichier en texte clair appelé "mysshpassword.txt" et l'avons passé en utilisant le drapeau -f. Nous pouvons également chiffrer le fichier de mot de passe en texte clair avec gpg.

Ajoutez le mot de passe dans un fichier texte appelé mysshpassword avec la commande echo :

$ echo "almalinux" > ~/.mysshpassword

Avez-vous remarqué que j'ai mis un point avant mysshpassword ? Cela signifie que j'ai caché le fichier de mot de passe dans mon répertoire $HOME.

Chiffrez le fichier de mots de passe en utilisant la commande gpg :

$ gpg -c ~/.mysshpassword

Il vous sera demandé de saisir une phrase de passe dans une nouvelle fenêtre contextuelle. Tapez la phrase de passe deux fois et cliquez sur OK pour fermer la fenêtre.

Supprimez le fichier de mot de passe en texte clair :

$ rm ~/.mysshpassword

Maintenant, vous pouvez exécuter les commandes sur une machine distante en utilisant la commande suivante :

$ gpg -d -q ~/.mysshpassword.gpg | sshpass ssh ostechnix@192.168.1.20 uname -a

Veuillez noter que la commande ci-dessus ne se connectera pas en SSH au système distant. Elle exécute uniquement la commande uname -a sur le système distant.

Exemple 2 - Transférer des fichiers en utilisant Rsync avec sshpass

Pour transférer un fichier du système local vers un système distant en utilisant Rsync via SSH, exécutez :

$ rsync ~/file.txt --rsh="sshpass -p almalinux ssh -l ostechnix" 192.168.1.20:/home/ostechnix/

Vous pouvez également utiliser l'option -e comme indiqué dans la section Exemple 1 pour transférer des fichiers de manière légèrement moins exposée.

$ export SSHPASS=almalinux
$ rsync ~/file.txt --rsh="sshpass -e ssh -l ostechnix" 192.168.1.20:/home/ostechnix/

Exemple 3 - Copier des fichiers en utilisant scp avec sshpass

Nous pouvons utiliser sshpass avec la commande scp pour copier des fichiers entre les systèmes locaux et distants en mode non interactif.

$ scp ~/file.txt --rsh="sshpass -p almalinux ssh -l ostechnix" 192.168.1.20:/home/ostechnix/

Exemple 4 - Automatisation du mot de passe SSH avec sshpass dans les scripts shell

Dans les sections précédentes, nous avons expliqué comment se connecter à distance via SSH de manière non interactive en utilisant sshpass. Voyons maintenant comment utiliser sshpass pour gérer les connexions SSH dans les scripts shell.

Créez un nouveau script appelé diskusage_sript.sh avec le contenu suivant à l'intérieur.

#!/usr/bin/env bash

#-------------------------------------------------------
#Author: Ostechnix
#Purpose: Report file system disk space usage of remote systems 
#-------------------------------------------------------
SSHPASS=almalinux sshpass -e ssh ostechnix@192.168.1.20 'df -h'

Exécutez le script en utilisant la commande :

$ sh diskusage_sript.sh 

Exemple de sortie :

Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0       20G  1.4G   18G   8% /
none            492K  4.0K  488K   1% /dev
udev             16G     0   16G   0% /dev/tty
tmpfs            16G     0   16G   0% /dev/shm
tmpfs            16G  8.6M   16G   1% /run
tmpfs           3.1G     0  3.1G   0% /run/user/1000
Utiliser sshpass dans les scripts shell

si vous ne voulez pas mettre le mot de passe en clair dans le script, vous pouvez simplement chiffrer le fichier de mot de passe en utilisant gpg comme montré dans la section Exemple 1 et remplacer la dernière ligne du script par la ligne suivante.

gpg -d -q ~/.mysshpassword.gpg | sshpass ssh ostechnix@192.168.1.20 'df -h'

Après avoir modifié la ligne, le script réel devrait ressembler à ce qui suit :

#!/usr/bin/env bash

#-------------------------------------------------------
#Author: Ostechnix
#Purpose: Report file system disk space usage of remote systems 
#-------------------------------------------------------
gpg -d -q ~/.mysshpassword.gpg | sshpass ssh ostechnix@192.168.1.20 'df -h'

Pour plus de détails sur l'utilisation de sshpass, consultez la page du manuel.

$ man sshpass

Conclusion

Dans ce guide, nous avons appris ce qu'est sshpass, comment installer sshpass sur divers systèmes Linux et FreeBSD, comment utiliser sshpass pour une connexion SSH non interactive, et enfin comment effectuer une automatisation du mot de passe SSH dans les scripts shell à l'aide de l'utilitaire sshpass sur les systèmes Linux et FreeBSD.

Veuillez noter que sshpass n'est pas un remplacement de la méthode d'authentification basée sur les clés SSH. Vous pouvez utiliser sshpass chaque fois que vous devez mettre en œuvre une authentification par mot de passe en mode non interactif.

Comme je l'ai déjà averti, l'utilisation de sshpass dans un système partagé n'est PAS recommandée. En effet, le mot de passe est enregistré dans l'historique du shell et tous les utilisateurs du système peuvent le voir simplement en consultant le fichier d'historique de bash.

Si vous êtes le seul à utiliser le système, alors ce n'est pas un gros problème. Vous pouvez utiliser sshpass pour mettre en œuvre une authentification SSH automatisée basée sur le mot de passe.

Référence :