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.
ssh
doit ê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 suppressionsleep
empêche l'ssh
exé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.