138 votes

écrire un shell script pour ssh vers une machine distante et exécuter des commandes.

J'ai deux questions :

  1. Il y a plusieurs machines linux distantes, et je dois écrire un shell script qui exécutera le même ensemble de commandes dans chaque machine. (Y compris certaines opérations sudo). Comment cela peut-il être fait en utilisant le script shell ?
  2. Lorsque vous vous connectez par ssh à la machine distante, comment gérer la demande d'authentification par empreinte digitale RSA ?

Les machines distantes sont des VMs créées sur le run et je n'ai que leurs IPs. Donc, je ne peux pas placer un fichier script au préalable dans ces machines et les exécuter depuis ma machine.

179voto

Andreas Points 16923

Il y a plusieurs machines linux distantes, et je dois écrire un shell script qui exécutera le même ensemble de commandes dans chaque machine. (Y compris certaines opérations sudo). Comment cela peut-il être fait en utilisant le script shell ?

Vous pouvez le faire avec ssh, par exemple :

#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

Lorsque vous vous connectez par ssh à la machine distante, comment gérer la demande d'authentification par empreinte digitale RSA ?

Vous pouvez ajouter le StrictHostKeyChecking=no pour ssh :

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

Cela permettra désactiver la vérification de la clé hôte et ajouter automatiquement la clé d'hôte à la liste des hôtes connus. Si vous ne souhaitez pas que l'hôte soit ajouté au fichier des hôtes connus, ajoutez l'option -o UserKnownHostsFile=/dev/null .

Notez que cette désactive certains contrôles de sécurité par exemple la protection contre les attaques de type "man-in-the-middle". Elle ne devrait donc pas être appliquée dans un environnement sensible à la sécurité.

11voto

Arjun G Perambra Points 1152

Installer sshpass en utilisant, apt-get install sshpass puis éditez le script et mettez vos machines linux IP, noms d'utilisateurs et mot de passe dans l'ordre respectif. Après cela, exécutez ce script. C'est tout ! Ce script va installer VLC sur tous les systèmes.

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done

8voto

Viraj.Hadoop Points 154

Ça marche pour moi.

Syntaxe : ssh -i pemfile.pem nom_utilisateur@adresse_ip 'commande_1 ; commande 2 ; commande 3'.

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service'

5voto

DigitalRoss Points 80400

Il y a plusieurs façons de procéder.

Ma méthode préférée est d'installer http://pamsshagentauth.sourceforge.net/ sur les systèmes distants et aussi votre propre clé publique. (Trouvez un moyen d'installer ces éléments sur la VM, vous avez réussi à installer un système Unix complet, qu'est-ce que quelques fichiers de plus ?)

Avec votre agent ssh transféré, vous pouvez maintenant vous connecter à tous les systèmes sans mot de passe.

Et encore mieux, ce module pam s'authentifiera pour sudo avec votre paire de clés ssh afin que vous puissiez fonctionner avec les droits de Root (ou de tout autre utilisateur) si nécessaire.

Vous n'avez pas besoin de vous soucier de l'interaction avec la clé de l'hôte. Si l'entrée n'est pas un terminal, ssh limitera simplement votre capacité à transférer des agents et à vous authentifier avec des mots de passe.

Vous devriez également examiner les paquets comme Capistrano. Jetez un coup d'œil à ce site ; il contient une introduction aux scripts à distance.

Les lignes individuelles de script pourraient ressembler à quelque chose comme ceci :

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply

3voto

hmofrad Points 871

La réponse acceptée est d'utiliser les machines de manière séquentielle. Dans le cas où vous voulez ssh à plusieurs machines et exécuter des commandes longues comme scp simultanément sur eux, exécutez le ssh en tant que processus d'arrière-plan.

#!/bin/bash
username="user"
servers=("srv-001" "srv-002" "srv-002" "srv-003");
script="pwd;"
for s in "${servers[@]}"; do
    echo "sshing ${username}@${s} to run ${script}"
    (ssh ${username}@${s} ${script})& # Run in background
done
wait # If removed, you can run some other script here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X