SSH 会话中的 Ctrl-C 处理

SSH 会话中的 Ctrl-C 处理

当我启动执行长时间运行命令的 SSH 会话时,Ctrl+ C(SIGINT) 处理会发生什么情况?

我可以看到 SSH 会话已关闭,但我不确定谁先收到 SIGINT:是吗?

  1. 远程长时间运行的命令?也就是说,(a) 调用远程命令中的信号处理程序并停止远程命令,(b) 生成它的 shell 检测到命令已停止,也停止 (c) 远程 sshd 检测到 shell 已停止,所以它关闭连接

    或者

  2. 本地 ssh 接收到信号,并关闭连接。

我认为(1)正在发生,但想确定一下。

我也不确定在这种情况下,SIGINT 的 shell 处理会发生什么。例如,如果我...

ssh remote 'while true ; do sleep 1 ; date ; done'

Ctrl+ C,则远程连接将被断开。有没有办法在 shell 下运行远程命令,该命令在Ctrl+之后保持活动状态C?也就是说,在这种情况下,停止循环并允许我继续在远程 shell 上工作?

答案1

ssh可以通过几种不同的方式调用,每种方式都会对终端发起的信号(例如Ctrl-C.

  • ssh remotehost将在 上运行交互式会话remotehost。在客户端,ssh将尝试将 stdin 使用的 tty 设置为“原始”模式,并sshd在远程主机上分配一个伪 tty 并将您的 shell 作为登录 shell 运行(例如-bash)。

    设置原始模式意味着通常发送信号的字符(例如Ctrl-CCtrl-\)将被插入到输入流中。ssh将按原样将此类字符发送到远程主机,它们可能会发送 SIGINT 或 SIGQUIT,并且通常会终止任何命令并将您返回到远程主机上的 shell。只要远程 shell 处于活动状态,ssh 连接就会保持活动状态。

  • ssh -t remotehost command args ...将在 上运行交互式会话remotehost,就像上面一样,除了在远程端,your_shell -c "command args ..."将运行。如上所述,如果您输入Ctrl-C,它将被发送到远程主机,该命令可能会收到 SIGINT 并立即退出,然后远程 shell 将退出。然后遥控器sshd关闭连接,并ssh报告Connection to remotehost closed.

  • ssh remotehost command args ...将在 上运行非交互式会话remotehost。在客户端,ssh不是将 tty 设置为原始模式(好吧,除了读取密码或密码短语)。如果您输入Ctrl-Cssh将收到 SIGINT 并立即终止,甚至不会发出Connection to remotehost closed消息。

    这些your_shell -c "command args ..."过程将可能仍在远程主机上运行。它们要么自行退出,要么一个进程尝试将数据写入现已关闭的 ssh 套接字,这将导致向其发送一个(通常)致命的 SIGPIPE 信号。

相关内容