é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écutera le même ensemble de commandes sur chaque machine. (Y compris certaines opérations sudo). Comment cela peut-il être fait en utilisant un script shell?
  2. Lorsque vous vous connectez à la machine distante, comment gérer quand il demande l’authentification par empreinte digitale RSA.

Les machines distantes sont des machines virtuelles créées à la volée et j’ai juste leurs adresses IP. Je ne peux donc pas placer de fichier de script au préalable sur ces machines et les exécuter depuis ma machine.

Il existe plusieurs machines Linux distantes, et je dois écrire un script shell qui exécutera le même ensemble de commandes sur chaque machine. (Y compris certaines opérations sudo). Comment cela peut-il être fait en utilisant un 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 à la machine distante, comment gérer quand il demande l’authentification par empreinte digitale RSA.

Vous pouvez append l’option SsortingctHostKeyChecking=no à ssh:

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

Cela désactive la vérification de la clé de l’hôte et ajoute 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 d’hôtes connu, ajoutez l’option -o UserKnownHostsFile=/dev/null .

Notez que cela désactive certaines vérifications de sécurité , par exemple la protection contre les attaques de type intermédiaire. Il ne doit donc pas être appliqué dans un environnement sensible à la sécurité.

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 et sur votre propre clé publique. (Trouvez un moyen de les installer sur la machine virtuelle, vous avez en quelque sorte installé un système Unix complet, quelques fichiers supplémentaires?)

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 exécuter avec les droits root (ou tout autre utilisateur) si nécessaire.

Vous n’avez pas à vous soucier de l’interaction de 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 vous pencher sur des paquets comme Capistrano. Certainement regarder autour de ce site; il a une introduction à la programmation à distance.

Les lignes de script individuelles peuvent ressembler à ceci:

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

Installez sshpass en utilisant, apt-get install sshpass puis éditez le script et placez les adresses IP, noms d’utilisateur et mot de passe de vos machines Linux dans leur ordre respectif. Après cela, lancez ce script. C’est tout ! Ce script installera VLC dans 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 

Si vous pouvez écrire du code Perl, vous devriez alors 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 prendra en charge tous les détails effrayants. L’exécution de commandes via sudo est également prise en charge.

Vous pouvez suivre cette approche:

  • Connectez-vous à une machine distante à l’aide du script Expect . Si votre machine ne prend pas en charge, attendez-vous à pouvoir télécharger le même fichier. Ecrire script Expect est très facile (google pour obtenir de l’aide à ce sujet)
  • Placez toutes les actions à effectuer sur le serveur distant dans un script shell.
  • Appelez le script shell distant à partir du script attendue une fois la connexion réussie.