J'essaie d'automatiser plusieurs tâches courantes que je SSH sur un serveur distant. Pour cela, j'utilise PuTTY et son option "commande à distance" (Connexion> SSH) dans plusieurs sessions enregistrées. Ma commande à distance ressemble à ceci:
~/scripts/test; $SHELL -l
Le script exécuté diffère selon les sessions enregistrées et effectue différentes tâches. $SHELL -l
garde la session PuTTY active après l'exécution du script.
Tout cela fonctionne parfaitement pour la plupart des scripts que je lance. Cependant, j'en ai un qui utilise une boucle while pour exécuter une série de commandes jusqu'à ce qu'il se termine par Ctrl + C. Le script commence bien, mais le shell PuTTY ne reste pas actif une fois terminé. $SHELL -l
ne semble pas être en cours d'exécution.
Un exemple de script avec ce comportement est le suivant:
while true; do
echo "."
sleep 2
done
Ce qui suit fonctionne correctement, exécuté manuellement. Je vois le résultat attendu de la deuxième commande:
~/scripts/test; echo "done"
Cependant, la deuxième commande de la "commande à distance" de PuTTY ne s'exécute pas. En effet, si je change la commande à distance pour inclure un echo
, celle-ci ne sera pas affichée.
~/scripts/test; echo "done"; $SHELL -l
Je suppose donc que ma question est la suivante: pourquoi la deuxième commande de la liste n'est-elle pas exécutée par la commande distante, alors qu'elle est exécutée manuellement? Et, plus important encore, que puis-je faire à ce sujet?
Si c'est pertinent, je lance PuTTY sur Ubuntu 14.04.
ssh
(OpenSSH)? Cela devrait être installé par défaut sur Ubuntu. Ou si vous devez vraiment utiliser PuTTY, utilisezplink
, spécialement conçu pour l'automatisation.Réponses:
Lorsque vous exécutez
putty
oussh
- je ne pense pas qu'il y ait de différence dans ce contexte - avec une commande à exécuter sur le système distant, le serveur ssh distant exécute la commande en tant que commande shell:Vous avez donc une
bash
instance sur le système distant qui exécute ce pipeline. Vous avez également une autrebash
instance, lancée par la première instance, qui exécute ce script "test".Lorsque vous tapez Control-C,
putty
envoie le caractère au système distant où il est interprété par votre téléscripteur comme le caractère d'interruption. Cela se traduit par l'envoi d'un SIGINT (signal d'interruption) aux processus liés au TTY. Cela interrompt ces deux processus shell, ce qui entraîne leur sortie. Vous voulez que l'instance de shell parent ignore SIGINT.La commande bash à ignorer SIGINT est la suivante:
Ainsi, pour désactiver SIGINT pour votre pipeline, modifiez votre commande d'origine en:
Mais cela désactive également SIGINT pour les processus enfants, ce qui rendrait le script "test" immunisé contre Ctrl-C. Vous devez donc réactiver SIGINT pour le script de test. La commande pour cela est:
Vous pouvez ajouter cette ligne au script de test lui-même ou au pipeline:
Maintenant, lorsque vous appuyez sur Ctrl-C, vous devez interrompre le processus "test" mais pas le processus parent qui exécute le pipeline de commandes.
Vous pouvez tester cela sans utiliser putty ou ssh. Il suffit d’exécuter ces commandes et d’appuyer sur Ctrl-C pendant l’exécution du "sommeil":
la source
En fait, ctrl + c pour la commande à distance putty interrompt la session ssh. Il faut donc s’attendre à ce qu’elle n’exécute pas les commandes à distance restantes. Si vous souhaitez simplement que la session reste active, votre boucle infinie devrait suffire.
la source