我希望能够通过 ssh 发送信号(SIGINT 是最重要的)。
这个命令:
ssh server "sleep 1000;echo f" > foo
Run Code Online (Sandbox Code Playgroud)
将在服务器上开始睡眠,并在 1000 秒后将 'f\n' 放在我本地机器上的文件 foo 中。如果我按 CTRL-C(即向 ssh 发送 SIGINT),它将终止 ssh,但不会终止远程服务器上的 sleep。我希望它杀死远程服务器上的睡眠。
所以我试过:
ssh server -t "sleep 1000;echo f" > foo
Run Code Online (Sandbox Code Playgroud)
但如果 stdin 不是终端,我会收到此错误:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Run Code Online (Sandbox Code Playgroud)
然后 SIGINT 仍然没有转发。
所以我试过:
ssh server -t -t "sleep 1000;echo f" > output
Run Code Online (Sandbox Code Playgroud)
但是 foo 中的输出不是 'f\n' 而是 'f\r\n' 这在我的情况下是灾难性的(因为我的输出是二进制数据)。
在上面我使用“sleep 1000;echo f”,但实际上它是由用户提供的,因此它可以包含任何内容。然而,如果我们可以让它适用于“sleep 1000;echo f”,我们很可能让它适用于所有现实情况。
我真的不关心在另一端获得伪终端,但我一直无法找到任何其他方式让 ssh 转发我的 SIGINT。
还有其他方法吗?
编辑:
用户可以给出从 …
在我的/etc/ssh/sshd_config文件中,我设置了以下参数:
ClientAliveInterval 10
ClientAliveCountMax 3
Run Code Online (Sandbox Code Playgroud)
现在,我从主机ssh对我的服务器(我对/etc/ssh/sshd_config)文件进行了更改。之后我ssh通过运行以下命令重新启动服务:
/etc/init.d/sshd reload
Run Code Online (Sandbox Code Playgroud)
我预计ssh连接会在 30 秒后断开,但现在它已经持续了近一个小时。
有人可以让我知道这里出了什么问题吗?
我使用的是 OpenSSH 版本 6.1。
我已经设置了一个 SSH 连接来在远程服务器上运行一个程序。该程序每 10 秒在终端上打印一次调试信息。如果我将 SSH 窗口打开很长时间(比如 10 小时),SSH 连接是否会变为非活动状态?如何在 SSH 会话中定义活动?我应该每 x 秒输入/运行一次命令以保持会话活动吗?