首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过SSH向当前远程进程发送信号(Ctrl-C) (没有-t选项)

如何通过SSH向当前远程进程发送信号(Ctrl-C) (没有-t选项)
EN

Stack Overflow用户
提问于 2017-06-04 04:01:46
回答 2查看 10.1K关注 0票数 6

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

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

代码语言:javascript
运行
复制
ssh -t user@host

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的远程会话。

票数 8
EN

Stack Overflow用户

发布于 2017-06-04 21:17:47

简短的回答:

代码语言:javascript
运行
复制
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选项,则无法通过向在终端上运行的进程发出信号来退出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44348083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档