我需要向SSH会话中运行在前台的远程进程发送SIGINT。
SSH会话已经建立,所以我不能使用启动它的选项(如How to send SIGINT to a remote process over SSH?中所述)
ssh -t user@host
我知道我可以打开第二个ssh会话并终止该进程,或者关闭当前的ssh会话,但我希望避免这种情况,并直接抛出当前会话(如果可能的话)。
发布于 2017-06-04 21:11:12
如果在没有PTY的情况下使用ssh在远程系统上启动一个进程,那么据我所知,无法通过该ssh会话向远程进程发送信号。
SSH协议有一个message to send a signal to the remote process。但是,您可能将OpenSSH用于客户机或服务器,或者两者都使用,而OpenSSH并不实现信号消息。因此,OpenSSH客户端无法发送消息,OpenSSH服务器也不会对其执行操作。
有一个OpenSSH支持的SSH extension to send a "break" message。在交互式会话中,OpenSSH客户端有一个escape sequence,您可以键入该you将中断发送到服务器。OpenSSH服务器通过向远程会话的PTY发送中断来处理中断消息,而unix PTY通常会将中断视为SIGINT。然而,中断基本上是一个TTY概念,所有这些都不适用于没有PTY的远程会话。
发布于 2017-06-04 21:17:47
简短的回答:
ssh -t fs "stty isig intr ^N -echoctl ; trap '/bin/true' SIGINT; sleep 1000; echo f" > foo
并通过CTRL+N停止该程序。
冗长的解释:
1.您必须使用stty选项intr来更改服务器或本地中断字符,以避免与每个other.In冲突。上面的命令我已将服务器中断字符更改为CTRL+N。您可以更改本地中断字符,而保留服务器的本地中断字符不做任何更改。
2.如果不希望中断字符出现在输出中(以及任何其他控制字符),请使用stty -echoctl。
3.您必须确保在sshd调用的服务器bash上打开了控制字符。如果不这样做,那么在注销后进程仍然会挂起。stty isig
4.您实际上是通过使用空语句捕获“/bin/true”SIGINT信号。如果没有陷阱,您的终端将不会有任何stdout信号。
但如果没有-t选项,则无法通过向在终端上运行的进程发出信号来退出。
https://stackoverflow.com/questions/44348083
复制相似问题