Question

mon problème est le suivant :J'écris un script dont le but est d'exécuter certains scripts sur différents serveurs en parallèle.C'est-à-dire que je veux me connecter à un serveur distant, saisir le mot de passe (ce n'est pas négociable car patron), démarrer le script, fermer la connexion pendant que le script est toujours en cours d'exécution, me connecter au serveur suivant et refaire toute la danse.Comment fait-on ça?

Était-ce utile?

La solution

En supposant que bash soit le shell cible sur toutes les machines distantes, vous pouvez le faire pour une seule machine :

ssh user@host /path/to/script '&>/dev/null' '</dev/null' '&' disown

Pour plusieurs machines, vous pouvez alors écrire ceci comme :

hosts='user1@host1 user2@host2'

for host in $hosts
do
  ssh $host /path/to/script '&>/dev/null' '</dev/null' '&' disown
done

Cela devrait simplement vous permettre de saisir des mots de passe.

Alternativement, si vous pouvez utiliser le même mot de passe pour plusieurs machines, je vous recommande de consulter ClusterSSH.Avec cela, vous pouvez vous connecter à plusieurs machines simultanément et saisir des commandes à envoyer à chacune d'elles dans une seule fenêtre ou individuellement dans chaque fenêtre xterm.Cela vous éviterait de taper le même mot de passe à plusieurs reprises.Une fois connecté, vous pouvez exécuter la commande comme ci-dessus (sans le ssh user@host partie) et sortez.

Mise à jour

Quelques réflexions supplémentaires ici.Tout d'abord, ce n'est probablement pas une bonne idée d'ignorer complètement la sortie du script, car vous ne saurez jamais ce qui s'est passé en cas de problème.Vous pouvez simplement le mettre dans un fichier pour le consulter plus tard en remplaçant '&>/dev/null' avec '&>filename'.Une autre approche consisterait à ce que la machine distante vous l'envoie par courrier électronique (à condition qu'elle soit correctement configurée pour ce faire) :

host=user@host
ssh $host \(/path/to/script '2>&1' \| mail -s "$host output" me@me.com\) \
  '&>/dev/null' '</dev/null' '&' disown

Deuxièmement, si le script se trouve sur l'hôte local, vous pouvez le copier et l'exécuter en une seule commande.Suppose un script shell, sinon remplacez simplement sh avec le bon interprète)

</path/to/script ssh user@host \
  cat \>script \; sh ./script '&>/dev/null' '</dev/null' '&' disown

Autres conseils

Après vous être connecté, vous pouvez utiliser l'utilitaire d'écran pour démarrer une nouvelle session de terminal et détacher ultérieur de celui-ci, exemple:

[user@local]$ ssh machine
[user@machine]$ screen -S my_session
# you are now switched to new terminal session named "my_session"
# now you can start long operation, that you want to keep in background
[user@machine]$ yes
# press "Ctrl-a d" to detach, you will go back to original session
[detached from 11271.my_session]
# now you can leave ssh (your session with "yes" running will be kept in background)
# to list existing screen sessions run:
[user@machine]$ screen -list
There is a screen on:
11271.my_session    (Detached)
1 Socket in /var/run/screen/S-user.
# to re-attach use -r
[user@machine]$ screen -r my_session
# you will be back to session with "yes" still running (press Ctrl-C to stop it)

Une fois que vous comprendrez comment fonctionne l'écran, vous pouvez essayer de le scripter;C'est ainsi que vous démarrez une session d'écran dans l'état détaché en cours d'exécution My_Command:

$ screen -d -m my_command

expect peut automatiser cela assez facilement :

#!/usr/bin/expect -f

set hosts {your list of hosts goes here ...}
foreach host $hosts {
    spawn ssh -t user@$host screen ./script.sh
    expect "assword:"
    send -- "secret\r"
    sleep 1
    send -- "d"
    expect eof
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top