Commande à distance PuTTY contenant la boucle while

0

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 -lgarde 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 -lne 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.

Oogles
la source
Pourquoi ne pas simplement utiliser ssh(OpenSSH)? Cela devrait être installé par défaut sur Ubuntu. Ou si vous devez vraiment utiliser PuTTY, utilisez plink, spécialement conçu pour l'automatisation.
Bob
J'ai envisagé de répondre à cela dans le cadre de la question, j'ai pensé que cela pourrait arriver :). Je connais bien les sessions de sauvegarde de mastic et les options que j'ai là-bas, de l’utiliser sous Windows. Et comme le mastic était pris en charge sous Linux, je ne voyais pas le besoin de changer de ce que je connaissais. Mais je vais regarder plink, merci :).
Oogles

Réponses:

2

Lorsque vous exécutez puttyou ssh- 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:

/bin/bash -c '~/scripts/test; $SHELL -l'

Vous avez donc une bashinstance sur le système distant qui exécute ce pipeline. Vous avez également une autre bashinstance, lancée par la première instance, qui exécute ce script "test".

Lorsque vous tapez Control-C, puttyenvoie 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:

trap "" INT

Ainsi, pour désactiver SIGINT pour votre pipeline, modifiez votre commande d'origine en:

trap '' INT; ~/scripts/test; $SHELL -l

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:

trap INT

Vous pouvez ajouter cette ligne au script de test lui-même ou au pipeline:

trap '' INT; ( trap INT; ~/scripts/test ); $SHELL -l

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":

bash -c 'sleep 15; echo foo'                  # Ctrl-C kills sleep; doesn't print "foo"
bash -c 'trap "" INT ; sleep 15; echo foo'    # Ctrl-C has no effect
bash -c 'trap "" INT; ( trap INT; sleep 15 ); echo foo'    # Kills sleep, prints "foo"
Kenster
la source
Merci pour cette réponse informative. Cela fonctionne parfaitement :).
Oogles
0

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.

Faiz R
la source
La raison principale pour laquelle je souhaite revenir à un shell interactif est que la commande de bouclage nécessite parfois un arrêt et un redémarrage, ce qui serait bien de le faire dans la même session. Sinon, oui, juste la boucle suffirait :).
Oogles