Je veux pouvoir envoyer des signaux (SIGINT est le plus important) via ssh.
Cette commande:
ssh server "sleep 1000;echo f" > foo
va commencer à dormir sur le serveur et après 1000 secondes, il mettra 'f \ n' dans le fichier foo sur ma machine locale. Si j'appuie sur CTRL-C (c'est-à-dire que j'envoie SIGINT à ssh), cela tuera ssh, mais il ne tuera pas sleep sur le serveur distant. Je veux qu'il tue le sommeil sur le serveur distant.
J'ai donc essayé:
ssh server -t "sleep 1000;echo f" > foo
Mais si stdin n'est pas un terminal, j'obtiens cette erreur:
Pseudo-terminal will not be allocated because stdin is not a terminal.
puis SIGINT n'est toujours pas transmis.
J'ai donc essayé:
ssh server -t -t "sleep 1000;echo f" > output
Mais alors la sortie dans foo n'est pas 'f \ n' mais plutôt 'f \ r \ n' ce qui est désastreux dans ma situation (car ma sortie est des données binaires).
Dans ce qui précède, j'utilise "sleep 1000; echo f", mais en réalité qui est fourni par l'utilisateur, il peut donc contenir n'importe quoi. Cependant, si nous pouvons le faire fonctionner pour "sleep 1000; echo f", nous pouvons très probablement le faire fonctionner pour toutes les situations réalistes.
Je ne me soucie vraiment pas d'obtenir un pseudo-terminal à l'autre extrémité, mais je n'ai pas pu trouver d'autre moyen de faire en sorte que ssh transfère mon SIGINT.
Y a-t-il une autre façon?
Modifier:
L'utilisateur peut donner des commandes qui lisent des données binaires depuis stdin, telles que:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
L'utilisateur peut donner des commandes gourmandes en CPU, telles que:
ssh server "timeout 1000 burnP6"
Edit2:
La version qui semble fonctionner pour moi est:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Merci à digital_infinity de m'avoir pointé dans la bonne direction.
sshdoit être plus compliquée que ce que vous montrez à titre d'exemples, car vous pouvez obtenir le comportement que vous souhaitez avec un simple réarrangement:sleep 1000 && ssh server "echo f" > foo(Il doit l'être&&, non;, afin que la suppressionsleepempêche l'sshexécution de la commande.) Si je avez raison, veuillez rendre vos exemples plus représentatifs de votre utilisation réelle, afin qu'une meilleure réponse puisse être donnée.