我需要向SSH会话中前台运行的远程进程发送SIGINT。如何通过SSH将SIGINT(Ctrl-C)发送到当前远程进程(不带-t选项)
SSH会话已经建立,所以我不能使用启动它(如How to send SIGINT to a remote process over SSH?描述)
ssh -t [email protected]
我知道我可以打开第二个SSH会话和杀死进程或关闭当前的选项ssh会话,但我想避免这种情况,并直接抛出当前会话(如果可能的话)。
我需要向SSH会话中前台运行的远程进程发送SIGINT。如何通过SSH将SIGINT(Ctrl-C)发送到当前远程进程(不带-t选项)
SSH会话已经建立,所以我不能使用启动它(如How to send SIGINT to a remote process over SSH?描述)
ssh -t [email protected]
我知道我可以打开第二个SSH会话和杀死进程或关闭当前的选项ssh会话,但我想避免这种情况,并直接抛出当前会话(如果可能的话)。
如果您使用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的远程会话。
简短的回答:
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选项,不能通过信号退出到在终端上运行的进程。
OP特别要求*不要*使用'-t' –
最后的声明清楚地表明,可以无法实现 – Harini
简短的回答是,你不能没有一个分配的终端(pty/tty),因为捕获一个密钥序列并将其转换为信号是终端的工作。如果维护一个套接字会话就是你想要实现的,那么你可以使用共享会话。多个ssh连接在同一个套接字上发生。如果您对开始共享会话的顺序很熟悉,那么终止主会话会终止次会话。 –
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