我需要在SSH会话中向前台运行的远程进程发送SIGINT。
SSH会话已经建立,所以我不能使用启动它的选项(如How to send SIGINT to a remote process over SSH?中所述)
ssh -t user@host
我知道我可以打开第二个ssh会话并终止进程或关闭当前的ssh会话,但是我想避免这种情况并直接抛出当前会话(如果可能的话)。
答案 0 :(得分:5)
如果您使用ssh在远程系统上启动没有PTY的进程,那么就我所知,没有办法通过该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,您可以键入该值以向服务器发送中断。 OpenSSH服务器通过向远程会话的PTY发送中断来处理中断消息,并且unix PTY通常将中断视为SIGINT。但是,休息时间基本上是TTY概念,并且这些都不适用于没有PTY的远程会话。
答案 1 :(得分:-1)
简短回答:
ssh -t fs "stty isig intr ^N -echoctl ; trap '/bin/true' SIGINT; sleep 1000; echo f" > foo
并按CTRL + N停止程序。
冗长的解释:
1.您必须使用stty选项intr来更改服务器或本地中断字符,以免相互冲突。在上面的命令中,我已将服务器中断字符更改为CTRL + N.您可以更改本地中断字符,并保留服务器的中断字符而不做任何更改。
2.如果您不希望中断字符出现在输出中(以及任何其他控制字符),请使用stty -echoctl。
3.您必须确保在sshd调用的服务器bash上打开控制字符。如果不这样做,您最终可能会在注销后仍然处于闲置状态。 stty isig
4.你实际上通过陷阱'/ bin / true'SIGINT用空语句捕获SIGINT信号。如果没有陷阱,在结束SIGINT信号后你就不会有任何标准输出。
但没有-t选项,不能通过终端上运行的进程发出信号退出。