Il existe plusieurs machines Linux distantes et j'ai besoin d'é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 des 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
Lors d'une connexion ssh à la machine distante, comment gérer le moment où elle demande l'authentification par empreinte digitale RSA.
Vous pouvez ajouter le StrictHostKeyChecking=no
option pour ssh :
ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"
Cela désactivera la vérification de la clé d'hôte et ajoutera 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 cela désactive certains contrôles de sécurité , par exemple la protection contre les attaques de l'homme du milieu. Il ne doit donc pas être appliqué dans un environnement sensible à la sécurité.
Installez sshpass en utilisant apt-get install sshpass
puis éditez le script et mettez les adresses IP, les noms d'utilisateur et le mot de passe de vos machines Linux dans l'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