当我启动一个执行长时间运行的命令的 SSH 会话时,Ctrl+ C(SIGINT) 处理会发生什么?
我可以看到 SSH 会话已关闭,但我不确定谁先获得 SIGINT:是...
远程长时间运行的命令?也就是说,(a) 远程命令中的信号处理程序被调用并停止远程命令,(b) 产生它的外壳检测到命令停止,并停止 (c) 远程 sshd 检测到外壳停止,所以它关闭了连接
或者
本地 ssh 接收到信号,并关闭连接。
我认为 (1) 正在发生,但想确定一下。
我也不确定在这种情况下 shell 处理 SIGINT 会发生什么。例如,如果我...
ssh remote 'while true ; do sleep 1 ; date ; done'
Run Code Online (Sandbox Code Playgroud)
和Ctrl+ C,然后远程连接被删除。有没有办法在Ctrl+后保持活动状态的外壳下运行远程命令C?也就是说,在这种情况下,停止循环并允许我继续在远程 shell 上工作?
Mar*_*ick 33
ssh可以通过几种不同的方式调用,每种方式都会导致对终端启动信号的处理略有不同,例如Ctrl-C.
ssh remotehost将在 上运行交互式会话remotehost。在客户端,ssh将尝试将 stdin 使用的 tty 设置为“原始”模式,并sshd在远程主机上分配一个伪 tty 并将您的 shell 作为登录 shell(例如-bash)运行。
设置原始模式意味着通常会发送信号(例如Ctrl-C和Ctrl-\)的字符只是插入到输入流中。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-C,ssh将收到 SIGINT 并立即终止,甚至不发出Connection to remotehost closed消息。
这些your_shell -c "command args ..."进程可能会继续在远程主机上运行。它们要么自己退出,要么一个进程尝试将数据写入现在关闭的 ssh 套接字,这将导致(通常)向其发送致命的 SIGPIPE 信号。
| 归档时间: |
|
| 查看次数: |
29053 次 |
| 最近记录: |