Quero poder enviar sinais (SIGINT é o mais importante) através do ssh.
Este comando:
ssh server "sleep 1000;echo f" > foo
iniciará o modo de suspensão no servidor e após 1000 segundos ele colocará 'f \ n' no arquivo foo na minha máquina local. Se eu pressionar CTRL-C (por exemplo, enviar SIGINT para ssh), ele matará o ssh, mas não matará o sono no servidor remoto. Eu quero matar o sono no servidor remoto.
Então eu tentei:
ssh server -t "sleep 1000;echo f" > foo
Mas se stdin não for um terminal, recebo este erro:
Pseudo-terminal will not be allocated because stdin is not a terminal.
e o SIGINT ainda não é encaminhado.
Então eu tentei:
ssh server -t -t "sleep 1000;echo f" > output
Mas então a saída em foo não é 'f \ n', mas sim 'f \ r \ n', o que é desastroso na minha situação (como minha saída são dados binários).
No exemplo acima, uso "sleep 1000; echo f", mas, na realidade, é fornecido pelo usuário, portanto pode conter qualquer coisa. No entanto, se podemos fazê-lo funcionar para "dormir 1000; eco de", provavelmente podemos fazê-lo para todas as situações realistas.
Realmente não me importo em obter um pseudo-terminal na outra extremidade, mas não consegui encontrar outra maneira de obter o ssh para encaminhar meu SIGINT.
Existe outro caminho?
Editar:
O usuário pode fornecer comandos que leem dados binários do stdin, como:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
O usuário pode fornecer comandos que consomem muita CPU, como:
ssh server "timeout 1000 burnP6"
Edit2:
A versão que parece funcionar para mim é:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
Obrigado ao digital_infinity por me indicar a direção certa.
ssh
deve ser mais complicado do que o que você mostra como exemplos, porque você pode obter o comportamento desejado com um simples rearranjo:sleep 1000 && ssh server "echo f" > foo
(Tem que ser&&
, não;
, para que matarsleep
impeça assh
execução do comando). Estou certo, torne seus exemplos mais representativos do seu uso real, para que uma resposta melhor possa ser dada.