Quiero poder enviar señales (SIGINT es lo más importante) a través de ssh.
Este comando:
ssh server "sleep 1000;echo f" > foo
comenzará a dormir en el servidor y después de 1000 segundos colocará 'f \ n' en el archivo foo en mi máquina local. Si presiono CTRL-C (es decir, enviar SIGINT a ssh) matará ssh, pero no matará el modo de suspensión en el servidor remoto. Quiero que mate el sueño en el servidor remoto.
Entonces intenté:
ssh server -t "sleep 1000;echo f" > foo
Pero si stdin no es un terminal me sale este error:
Pseudo-terminal will not be allocated because stdin is not a terminal.
y luego SIGINT todavía no se reenvía.
Entonces intenté:
ssh server -t -t "sleep 1000;echo f" > output
Pero entonces la salida en foo no es 'f \ n' sino 'f \ r \ n', lo cual es desastroso en mi situación (ya que mi salida son datos binarios).
En lo anterior utilizo "sleep 1000; echo f", pero en realidad lo proporciona el usuario, por lo que puede contener cualquier cosa. Sin embargo, si podemos hacer que funcione para "dormir 1000; echo f", lo más probable es que funcione para todas las situaciones realistas.
Realmente no me importa obtener un pseudo terminal en el otro extremo, pero no he podido encontrar ninguna otra forma de obtener ssh para reenviar mi SIGINT.
¿Hay otra manera?
Editar:
El usuario podría dar comandos que lean datos binarios de stdin, como:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
El usuario podría dar comandos que requieran un uso intensivo de la CPU, como:
ssh server "timeout 1000 burnP6"
Edit2:
La versión que parece funcionar para mí es:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Gracias a digital_infinity por señalarme en la dirección correcta.
ssh
debe ser más complicado de lo que muestra como ejemplos, porque puede obtener el comportamiento que desea con una simple reorganización:sleep 1000 && ssh server "echo f" > foo
(Tiene que ser&&
, no;
, para que matarsleep
evite que elssh
comando se ejecute). Tengo razón, haga que sus ejemplos sean más representativos de su uso real, de modo que se pueda dar una mejor respuesta.