如何通过SSH将SIGINT(Ctrl-C)发送到当前远程进程(不带-t选项)

时间:2017-06-03 20:01:46

标签: linux bash ssh

我需要在SSH会话中向前台运行的远程进程发送SIGINT。

SSH会话已经建立,所以我不能使用启动它的选项(如How to send SIGINT to a remote process over SSH?中所述)

ssh -t user@host

我知道我可以打开第二个ssh会话并终止进程或关闭当前的ssh会话,但是我想避免这种情况并直接抛出当前会话(如果可能的话)。

2 个答案:

答案 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选项,不能通过终端上运行的进程发出信号退出。