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.

2voto

Skanda Shastry Points 153

Il y a plusieurs façons d'exécuter les commandes ou script dans les multiples machines Linux distantes. L'un des moyens les plus simples et les plus faciles est de passer par pssh (programme ssh parallèle)

pssh ssh : est un programme permettant d'exécuter ssh en parallèle sur un certain nombre d'hôtes. Il fournit des fonctionnalités telles que l'envoi d'entrées à tous les processus, le passage d'un mot de passe à ssh, la sauvegarde de la sortie dans des fichiers et la temporisation.

Exemple et utilisation :

Connectez-vous à l'hôte1 et à l'hôte2, et imprimez "hello, world" depuis chacun d'eux :

 pssh -i -H "host1 host2" echo "hello, world"

Exécuter des commandes via un script sur plusieurs serveurs :

pssh -h hosts.txt -P -I<./commands.sh

Utilisation et exécution d'une commande sans vérifier ni sauvegarder les clés de l'hôte :

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

Si le fichier hosts.txt contient un grand nombre d'entrées, disons 100, l'option de parallélisme peut également être fixée à 100 pour s'assurer que les commandes sont exécutées simultanément :

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

Options :
-I : Lire l'entrée et envoyer à chaque processus ssh.
-P : Demande à pssh d'afficher la sortie au fur et à mesure qu'elle arrive.
-h : Lit le fichier de l'hôte.
-H : [user@]host[:port] pour un hôte unique.
-i : Affichage de la sortie standard et de l'erreur standard lorsque chaque hôte termine son travail.
-x args : Passe les arguments supplémentaires de la ligne de commande SSH
Option -o : Peut être utilisé pour donner des options dans le format utilisé dans le fichier de configuration.(/etc/ssh/ssh_config) (~/.ssh/config)
-p le parallélisme : Utilisez le nombre donné comme nombre maximum de connexions simultanées.
-q Mode silencieux : Permet de supprimer la plupart des messages d'avertissement et de diagnostic.
-t : Les connexions sont interrompues après le nombre de secondes indiqué. 0 signifie que pssh n'interrompra aucune connexion.

Lorsque vous vous connectez par ssh à la machine distante, comment gérer le fait que le système vous demande d'indiquer l'authentification par empreinte digitale RSA.

Désactiver le StrictHostKeyChecking pour gérer l'invite d'authentification RSA.
-o StrictHostKeyChecking=no

Fuente : man pssh

1voto

salva Points 5357

Si vous êtes capable d'écrire du code Perl, alors vous devriez envisager d'utiliser Net::OpenSSH::Parallel .

Vous pourriez décrire les actions qui doivent être exécutées dans chaque hôte de manière déclarative et le module se chargerait de tous les détails effrayants. Exécution de commandes via sudo est également pris en charge.

1voto

Fibo Points 31

Pour ce genre de tâches, j'utilise de façon répétée Ansible qui permet de dupliquer de manière cohérente des bash scripts dans plusieurs containets ou VM. Ansible (plus précisément Red Hat ) dispose désormais d'une interface web supplémentaire AWX qui est l'édition open-source de leur tour commercial.

Ansible : https://www.ansible.com/
AWX : https://github.com/ansible/awx
Ansible Tower : produit commercial, vous préférerez probablement explorer l'open-source gratuit AWX, plutôt que la piste gratuite de 15 jours de Tower.

1voto

Cela a fonctionné pour moi. J'ai créé une fonction. Mets ça dans ton shell script :

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

Si vous avez plusieurs machines sur lesquelles vous voulez exécuter la même commande, vous devez répéter cette ligne avec un point-virgule. Par exemple, si vous avez deux machines, vous devez faire ceci :

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

Remplacez USER par l'utilisateur de l'ordinateur. Remplacez HOST par le nom de l'ordinateur. Remplacez COMMANDE par la commande que vous souhaitez exécuter sur l'ordinateur.

J'espère que cela vous aidera !

-1voto

rai.skumar Points 3187

Vous pouvez suivre cette approche :

  • Connectez-vous à la machine distante en utilisant Attendre script . Si votre machine ne supporte pas expect, vous pouvez télécharger le même. Ecrire Expect script est très facile (google pour obtenir de l'aide à ce sujet)
  • Mettre toute l'action qui doit être effectuée sur le serveur distant dans un script shell.
  • Invoquer le shell distant script à partir de l'attente script une fois la connexion réussie.

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