我希望能够通过ssh发送信号(SIGINT最重要)。
该命令:
ssh server "sleep 1000;echo f" > foo
将开始在服务器上进入睡眠状态,并在1000秒后将“ f \ n”放入本地计算机上的foo文件中。如果按CTRL-C(即,将SIGINT发送到ssh),它将杀死ssh,但不会杀死远程服务器上的睡眠。我希望它杀死远程服务器上的睡眠。
所以我尝试了:
ssh server -t "sleep 1000;echo f" > foo
但是,如果stdin不是终端,则会出现此错误:
Pseudo-terminal will not be allocated because stdin is not a terminal.
然后SIGINT仍然不转发。
所以我尝试了:
ssh server -t -t "sleep 1000;echo f" > output
但是然后foo中的输出不是'f \ n'而是'f \ r \ n',这在我的情况下是灾难性的(因为我的输出是二进制数据)。
在上面,我使用“ sleep 1000; echo f”,但实际上由用户提供,因此它可以包含任何内容。但是,如果我们可以使其适用于“ sleep 1000; echo f”,那么很可能可以使其适用于所有现实情况。
我真的不在乎在另一端使用伪终端,但是我一直找不到其他通过ssh转发我的SIGINT的方法。
还有另一种方法吗?
编辑:
用户可以提供从stdin读取二进制数据的命令,例如:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
用户可以提供占用大量CPU资源的命令,例如:
ssh server "timeout 1000 burnP6"
编辑2:
似乎适合我的版本是:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
感谢digital_infinity向我指出正确的方向。
ssh
必须比示例显示的要复杂,因为您可以通过简单的重新排列就可以实现所需的行为:(sleep 1000 && ssh server "echo f" > foo
必须为&&
,而不是;
,这样杀死命令才能运行sleep
该ssh
命令。)如果我是的,请使您的示例更能代表您的实际用法,以便提供更好的答案。