Exécution d’un script Shell sur une Machine Distante Via SSH

By Corentin BURTIN

Plus souvent que jamais, en tant qu’administrateurs système, nous gérons invariablement différents types de serveurs à distance. L’exécution d’un script sur des machines distantes devient l’exigence fondamentale pour une gestion efficace du serveur. En particulier, il n’existe que quelques outils de gestion à distance principalement utilisés pour obtenir des données à partir de serveurs distants. Ceux-ci sont largement utilisés dans la gestion de centaines de serveurs distants pour une orchestration facile.

Ce tutoriel expliquera les moyens les plus simples d’exécuter des scripts sur une machine distante, en considérant Linux et Windows comme la machine locale.

SSH

SSH signifie Secure Shell, est un protocole de réseau cryptographique qui s’exécute à la couche 7 du modèle OSI pour les services de réseau sécurisés sur le réseau non sécurisé. Il fonctionne sur le port TCP 22 avec SSHv2 comme dernière version.

Il a de nombreuses fonctionnalités intéressantes comme l’exécution d’une commande sur des serveurs distants, la redirection de port, le tunneling, etc. Initialement, le client commence à négocier avec le serveur. Ensuite, le serveur envoie en outre sa clé d’échange publique pour appeler le canal et négocier les autres paramètres. Après des négociations réussies, il affiche l’invite de connexion du système d’exploitation hôte du serveur. De plus, le transfert de données de bout en bout a lieu sous forme cryptée.

Ici, nous utiliserons le module SSH pour exécuter des scripts sur des machines distantes.
freestar

Utilisation de l’utilisateur interactif SSH

Par souci d’illustration, nous utilisons le script BASH ci-dessous tout au long de cet article. Il extrait les détails de base de la machine distante tels que le nom d’hôte, l’adresse IP, la date et l’ID utilisateur actuel:

!/ bin / bash

echo « HEURE ACTUELLE = » ‘date echo "NOM D'HÔTE = ''nom d'hôte
align « ID UTILISATEUR= » ‘whoami scope ="row" ADRESSE IP = "'ip a s enp0s3/grep" inet//cut-f6-d""

Tout d’abord, la commande se connectera à la boîte distante à l’aide de SSH, puis elle exécutera la commande bash dans le Shell. L’option ”s » de Bash permet de lire la commande exécutable à partir de l’entrée standard:

A lire également :  Comment utiliser la commande iconv sous Linux ?

machine locale #ssh [email protected] « bash-l » < get_host_info.sh
[email protected] mot de passe:
HEURE ACTUELLE = Mon Oct 3 18:29:38 IST 2021
NOM D’HÔTE = SERVEUR DISTANT
ID UTILISATEUR = outils
COLSPAN = 192.168.56.103/24

Utilisation de SSH non interactif

Inutile de mentionner qu’il serait fastidieux de taper le mot de passe à chaque fois, dans un tel cas, d’utiliser le package sshpass et de passer les informations d’identification en ligne avec la commande. Il s’agit d’un hack volant qui fournit un moyen facile d’accéder à la boîte à distance:

machine locale #sshpass-vvv-p Baels @123 ssh [email protected] « bash-l » < get_host_info.sh
Recherche rapide de mot de passe SSHPASS en utilisant la correspondance « assword »
SSHPASS lire: [email protected] mot de passe:
Invite détectée par SSHPASS. Envoi du mot de passe.
SSHPASS lire:
HEURE ACTUELLE = Mon Oct 3 18:42:23 IST 2021
NOM D’HÔTE = SERVEUR DISTANT
ID UTILISATEUR = outils
COLSPAN = 192.168.56.103/24
machine locale#

Dans l’extrait de code détaillé ci-dessus, le sshpass recherche le modèle de mot de passe (sans P / p-« assword ») où il fournit le mot de passe à l’invite ssh. Pour fournir le mot de passe du fichier, nous pouvons utiliser l’option “-f” de sshpass. Il prend en charge ssh en fournissant le mot de passe mais néanmoins, il ne peut pas remplacer la commande ssh:
clés ssh-v mots de passe ssh

Loucher

plink est le client SSH open source gratuit disponible pour les plates-formes Windows. C’est la méthode la plus sûre, la plus propre et la plus pratique pour automatiser les actions SSH sur des machines distantes. Par défaut, il utilise le protocole SSH pour gérer les machines UNIX à distance. Mais en plus, il a également d’autres options comme telnet, rlogin, raw et serial. Plus important encore, plink est suffisamment flexible pour s’intégrer facilement aux scripts batch Windows qui exécutent des scripts à distance via SSH.
freestar

Sans plus tarder, agissons.

Ici, pour des raisons d’explication, nous avons déployé une version plink 0.62:

C:\Users\baeldung .01\ Téléchargements>.\plink-V
plink: Version 0.62

Le script get_host_info est placé dans la machine Windows locale, comme indiqué ci-dessous:

C:\Users\baeldung .01\Téléchargements > dir/findstr get_host_info
10/03/2021 03:49 166 get_host_info.sh

A lire également :  Ubuntu ou Arch Linux : Quelle distribution Linux choisir ?

Pour une meilleure élucidation, obtenons la sortie détaillée de la commande en utilisant l’option -v. Ici, nous forçons le protocole de communication en tant que SSH et donnons le nom du script sous l’option -m:

C:\Users\baeldung .01\ Téléchargements>.\ plink.exe-v-ssh [email protected] – l get_host_info.sh
Recherche d’hôte « 192.168.56.103 »
Connexion au port 192.168.56.103 22
Version du serveur: SSH-2.0- OpenSSH_7.6p1 Ubuntu-4ubuntu0.5
Utilisation du protocole SSH version 2
Nous revendiquons la version: SSH-2.0-PuTTY_Release_0.62

sortie tronquée

Tout d’abord, il commence par des vérifications d’accessibilité IP de couche 3 et établit la session à l’aide du numéro de port 22. Deuxièmement, la version SSH 2 est la version préférée après des négociations de version réussies:
freestar


sortie tronquée

Utilisation de Diffie-Hellman avec le groupe standard « group14 »
Faites un échange de clés Diffie-Hellman avec hash SHA-1
L’empreinte digitale de la clé hôte est:
ssh-rsa 2048 1e:77:e1:d2: eb:32:6b:b1:f9:cb:72:fe:ef:e6:a6:24
Client SDCTR AES-256 initialisé -> chiffrement du serveur
Algorithme client -> serveur MAC HMAC-SHA1 initialisé
Serveur SDCTR AES-256 initialisé -> cryptage client
Serveur HMAC-SHA1 initialisé -> Algorithme client MAC

Troisièmement, l’algorithme d’échange de clés Diffie-Hellman est utilisé pour échanger des clés cryptographiques entre deux machines. De plus, la communication est entièrement cryptée à l’aide des algorithmes AES-256 et HMAC-SHA1.


sortie tronquée

En utilisant le nom d’utilisateur « outils ».
[email protected] mot de passe:
Mot de passe envoyé
Accès accordé

Enfin, nous devons fournir le mot de passe pour authentifier la session. Maintenant, plink lance le sous-shell dans la machine distante pour exécuter le get_host_info.sh dans notre machine Windows locale:


sortie tronquée

Canal ouvert pour la session
Démarrage d’un shell/commande

HEURE ACTUELLE = Mon Oct 3 15:32:40 IST 2021
NOM D’HÔTE = SERVEUR DISTANT
ID UTILISATEUR = outils
État de sortie de la commande envoyée par le serveur 0
COLSPAN = 192.168.56.103/24
Déconnecté: Tous les canaux fermés

Évidemment, il sera fastidieux de taper le mot de passe à tout moment. Par conséquent, plink prend en charge la fonction de mot de passe en ligne à l’aide de l’option -pw. L’option -pw à l’unisson de l’option -m améliore son intégration plus rapide avec les scripts batch Windows pour une meilleure gestion du serveur distant:

A lire également :  Les meilleures distributions d'exploitation Linux

C:\Users\baeldung .01\ Téléchargements>.\ plink.exe [email protected] – l get_host_info.sh – P.W. Baels @123

HEURE ACTUELLE = Mon Oct 3 03:49:18 IST 2021
NOM D’HÔTE = SERVEUR DISTANT
ID UTILISATEUR = outils
COLSPAN = 192.168.56.103/24

Utilisation du script Expect

Habituellement, les scripts expect sous Linux permettent l’automatisation de plusieurs processus basés sur des terminaux CLI. Pour mieux assimiler, écrivons une attente que le programme exécute un script dans la machine distante à partir de l’hôte local.

Un script d’attente simple est expliqué ci-dessous qui se connecte d’abord à la boîte distante, copie le script de la source vers la machine distante, puis l’exécute:

!/ usr/bin / attendre

définir le délai d’attente 60
spawn ssh [lindexargargv 1] @[lindexargargv 0]
attendez-vous « *?mot de passe  » {
envoyer « [lindexargargv 2]\r »
}
attendre « : ~ { » {
envoyer « 
mkdir-p / accueil / outils / baeldung / autotest;
cd / accueil / outils / baeldung / auto-test;
arbre
sshpass-p’baels @123’scp-r [email protected]:/home/tools/cw/baeldung/get_host_info.sh ./;
arbre
bash get_host_info.sh\r »
}
attendre « : ~ { » {
envoyer « exit\r »
}
attendez-vous à eof

Appliquez des autorisations exécutables au programme expect créé à l’aide de la commande chmod. Les informations d’identification et l’adresse IP de la boîte distante sont les arguments d’entrée du programme:

machine locale #chmod 755 get_host.exp
numéro de machine locale./get_host.exp « localhost » « outils » « Baels@123 »
machine locale#

Dans la première étape, il génère une nouvelle session ssh avec le serveur distant. Selon le modèle CLI, il envoie le mot de passe pour une connexion réussie. Le programme crée l’environnement de test en créant un répertoire et en copiant le script principal à partir de la machine source. Ici, sshpass est utilisé pour envoyer le mot de passe en ligne à la commande scp pour copier le script principal. Le programme exécute le copié get_host_info.sh utilisation de la commande BASH dans la boîte distante. Enfin, il termine en toute sécurité le canal de communication à l’aide de la commande de sortie:

numéro de machine locale./get_host.exp « 192.168.56.103 » « outils » « Baels@123 »
spawn ssh [email protected]
[email protected] mot de passe:
..
..
Dernière connexion: Lun4 Oct 12:19:02 2021 à partir du 10.45.67.11
remote-machine #mkdir-p / accueil / outils / baeldung / autotest;
remote-machine #cd / accueil / outils / baeldung / autotest;
machine à distance #ls-ltrh
total 0
machine distante #sshpass-p ‘Baels @123’ scp-r [email protected]:/home/tools/cw/baeldung/get_host_info.sh ./;
machine à distance #ls-ltrh
total 4,0 K

  • rw-rw-r 1 1 outils outils 168 4 Oct 12:20 get_host_info.sh