web-dev-qa-db-fra.com

écrire un script shell sur ssh sur une machine distante et exécuter des commandes

J'ai deux questions:

  1. Il existe plusieurs machines linux distantes et je dois écrire un script Shell qui exécute le même ensemble de commandes sur chaque machine. (Y compris certaines opérations Sudo). Comment cela peut-il être fait en utilisant les scripts Shell?
  2. Lorsque vous vous connectez à la machine distante, comment gérer quand elle vous invite à vous authentifier par empreinte digitale RSA.

Les ordinateurs distants sont des ordinateurs virtuels créés à la volée et je ne dispose que de leurs adresses IP. Je ne peux donc pas placer un fichier de script à l’avance sur ces machines et les exécuter à partir de ma machine.

82
Balanivash

Il existe plusieurs machines linux distantes et je dois écrire un script Shell qui exécute le même ensemble de commandes sur chaque machine. (Y compris certaines opérations Sudo). Comment cela peut-il être fait en utilisant les scripts 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 à la machine distante, comment gérer quand elle vous invite à vous authentifier par empreinte digitale RSA.

Vous pouvez ajouter l'option StrictHostKeyChecking=no à ssh:

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

Ceci va désactiver la vérification de la clé de l'hôte et ajouter automatiquement la clé de l'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 cela désactive certaines vérifications de sécurité , par exemple une protection contre les attaques de type "man-in-the-middle". Il ne doit donc pas être appliqué dans un environnement sensible à la sécurité.

123
Andreas Fester

Il y a plusieurs façons de gérer cela.

Ma méthode préférée consiste à installer http://pamsshagentauth.sourceforge.net/ sur les systèmes distants ainsi que votre propre clé publique. (Trouvez un moyen de les installer sur la machine virtuelle. Vous avez en quelque sorte un système Unix complet installé, qu’est-ce qu’un ou deux fichiers de plus?)

Avec votre agent ssh transféré, vous pouvez maintenant vous connecter à chaque système 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 exécuter avec les droits root (ou ceux de tout autre utilisateur) selon vos besoins.

Vous n'avez pas à vous soucier de l'interaction clé 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 aussi regarder dans les paquets comme Capistrano. Certainement regarder autour de ce site; il présente une introduction au script distant.

Les lignes de script individuelles peuvent ressembler à ceci:

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

Installez sshpass en utilisant apt-get install sshpass puis éditez le script et mettez les adresses IP, les noms d'utilisateur et les mots de passe de vos machines Linux dans leur ordre respectif. Après cela, exécutez ce script. C'est ça ! Ce script installera 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
4
Arjun G Perambra

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

Vous seriez capable de décrire les actions qui doivent être exécutées dans chaque hôte de manière déclarative et le module se chargera de tous les détails effrayants. L'exécution de commandes via Sudo est également prise en charge.

2
salva

Pour ce type de tâches, j'utilise à plusieurs reprises Ansible qui permet de dupliquer de manière cohérente des scripts bash dans plusieurs conteneurs ou machines virtuelles. Ansible (plus précisément Red Hat ) dispose désormais d'une interface Web supplémentaire AWX qui est la -source édition de leur tour commerciale.

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: produit commercial, vous explorerez probablement le logiciel libre AWX open-source plutôt que le circuit gratuit de 15 jours de Tower

0
Fibo

Ce travail 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'
0
Viraj.Hadoop