2017-06-03 200 views
2

我需要向SSH会话中前台运行的远程进程发送SIGINT。如何通过SSH将SIGINT(Ctrl-C)发送到当前远程进程(不带-t选项)

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

ssh -t [email protected] 

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

+0

简短的回答是,你不能没有一个分配的终端(pty/tty),因为捕获一个密钥序列并将其转换为信号是终端的工作。如果维护一个套接字会话就是你想要实现的,那么你可以使用共享会话。多个ssh连接在同一个套接字上发生。如果您对开始共享会话的顺序很熟悉,那么终止主会话会终止次会话。 –

+0

Stack Overflow是编程和开发问题的网站。这个问题似乎与题目无关,因为它不涉及编程或开发。请参阅帮助中心的[我可以询问哪些主题](http://stackoverflow.com/help/on-topic)。也许[超级用户](http://superuser.com/)或[Unix&Linux堆栈交换](http://unix.stackexchange.com/)会是一个更好的地方。另请参阅[我在哪里发布有关Dev Ops的问题?](http://meta.stackexchange.com/q/134306) – jww

回答

3

如果您使用ssh在远程系统上启动没有PTY的进程,那么据我所知,无法通过该ssh会话发送远程进程的信号。

SSH协议有一个message to send a signal to the remote process。但是,您可能将OpenSSH用于客户端或服务器或两者,而OpenSSH不会执行信号消息。所以OpenSSH客户端不能发送消息,并且OpenSSH服务器不会对其执行操作。

有一个SSH extension to send a "break" message其中由OpenSSH支持。在交互式会话中,OpenSSH客户端有一个escape sequence,您可以键入该值以向服务器发送中断。 OpenSSH服务器通过向远程会话的PTY发送中断来处理中断消息,并且unix PTYs通常会将中断视为SIGINT。然而,休息从根本上说是TTY的概念,并且这些都不适用于没有PTY的远程会话。

-1

简短的回答:

ssh -t fs "stty isig intr ^N -echoctl ; trap '/bin/true' SIGINT; sleep 1000; echo f" > foo 

,并停止CTRL + N的计划。

朗解释:

上面我已经改变了服务器中断字符为Ctrl + N 1.You必须使用stty参数不及物动词改变你的服务器或本地中断字符不相other.In命令冲突。您可以更改您的本地中断字符,并保留服务器的中断字符而不做任何更改。

2.如果您不希望中断字符在您的输出(和任何其他控制字符)中使用stty -echoctl。

3.您必须确保控制字符在由sshd调用的服务器bash上打开。如果你不这样做,你可能会在注销后仍然处于悬挂状态。 stty isig

4.你实际上是通过陷阱'/ bin/true'捕获SIGINT信号,并用空语句进行SIGINT。如果没有陷阱,则在SIGINT信号结束后不会有任何标准输出。

但是没有-t选项,不能通过信号退出到在终端上运行的进程。

+0

OP特别要求*不要*使用'-t' –

+0

最后的声明清楚地表明,可以无法实现 – Harini