J'exécute la commande ci-dessous et surveille le fichier de sortie sur l'autre système:
ssh $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Si je tue la commande ssh en utilisant ^C
ou en tuant simplement le terminal auquel je suis connecté, je m'attends à ce que la commande à distance se termine également. Cependant, cela ne se produit pas: /tmp/count
obtient tous les nombres de 1 à 5 et ps -ejH
montre que le shell et son sleep
enfant continuent de fonctionner.
Ce comportement est-il attendu et est-il documenté quelque part? Puis-je le désactiver? En lisant, je m'attendais à devoir explicitement activer ce type de comportement avec nohup, pas pour que ce soit la valeur par défaut.
J'ai jeté un coup d'œil dans les pages de manuel pour ssh et sshd, mais je n'ai rien repéré d'évident, et Google me montre les instructions pour activer ce comportement, pas pour le désactiver.
J'utilise Red Hat Enterprise Linux 6.2, avec un login root et un shell bash sur les deux systèmes.
-tt
au lieu de-t
si ssh lui-même n'a pas de tty alloué. SSH n'obtiendra pas de tty alloué si ssh est mis en arrière-plan immédiatement lors de l'appel via des options comme-f
ou-n
.Essayez d'allouer un pseudo-tty avec votre
ssh
commande.ssh -t $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Lorsque vous déconnectez la session ssh, le processus doit se terminer.
Comme il s'agit d'un pseudo-tty, l'initialisation de votre shell ne va probablement pas aux fichiers de configuration source, laissant votre commande dans un environnement très nu. Vous devrez peut-être configurer un
.ssh/environment
fichier qui définit les variables d'environnement telles que PATH. Deman 1 ssh
la source
Au lieu d'utiliser l'
-t
option permettantssh
de terminer la commande à distance lorsque lessh
client se ferme ou (est tué), un canal nommé peut être utilisé pour convertir "EOF en SIGHUP" lorsque le stdin desshd
est fermé (voir bogue 396 - sshd processus orphelins quand aucun pty n'est alloué ).la source
C'est le meilleur moyen que j'ai trouvé pour le faire. Vous voulez quelque chose du côté serveur qui tente de lire stdin puis tue le groupe de processus en cas d'échec, mais vous voulez également un stdin côté client qui bloque jusqu'à ce que le processus côté serveur soit terminé et ne laisse pas de processus persistants comme <( dormir à l'infini) pourrait.
Il ne semble pas réellement rediriger stdout n'importe où, mais il fonctionne comme une entrée de blocage et évite de capturer les frappes.
Bogue openssh pertinent: https://bugzilla.mindrot.org/show_bug.cgi?id=396#c14
la source
Si vous souhaitez désactiver cela (apparemment comportement par défaut), vous devez activer ssh-keep-alive côté client ou serveur.
Si vous regardez les options ssh-keep-alive-dans les pages de manuel, vous pouvez voir qu'elles sont désactivées par défaut.
la source
Ma réponse est basée sur celle de teru. J'ai besoin d'un script d'aide
~/helper
sur le serveur server.ip:Si elle est appelée par exemple avec
et s'exécute
echo hello from server
sur server.ip, puis le client ssh se terminera.Si elle est appelée par exemple avec
kill -9 $CHID
arrêtera également le script sur le serveur. Pour moi,kill -INT $CHID
ça ne marche pas, mais je ne sais pas pourquoi.Dans la réponse de teru, la commande ssh attendra indéfiniment lorsque la commande à distance est terminée, car elle
cat
ne se termine jamais.Toutes les réponses avec ssh -t ne fonctionnaient pas pour moi avec
kill
, mais seulement avec Ctrl-C.Edit: J'ai découvert que cela fonctionnait à partir d'un nouvel Ubuntu 14.01 vers une ancienne boîte Linux scientifique - mais pas l'inverse. Ainsi, je pense qu'il n'y a pas de solution générale. Bizarre.
la source