首页 > 解决方案 > 当 ssh 连接关闭时,SIGHUP 的原始发送者是谁?

问题描述

我们知道,当 ssh 连接消失时,bash 会收到一个 SIGHUP,并将这个信号转发给它的所有子节点。

我想知道这个 SIGHUP 的原始发件人是谁,是 ssh 客户端、ssh 服务器、操作系统还是其他什么?

我阅读了openssh-portabal的代码,发现只在这里使用了SIGHUP:https ://github.com/openssh/openssh-portable/blob/master/sshconnect.c#L285

调用者似乎是客户端: https ://github.com/openssh/openssh-portable/blob/master/ssh.c#L1533

我在服务器端 sshd.c 中没有找到任何发件人代码

这是否意味着发件人是客户?在这种情况下,如果连接中断,服务器将不会收到 SIGHUP。我不太确定这一点,但根据我的经验,这似乎不是真的。

所以我很好奇谁应该是原始发件人。有这方面的标准吗?

标签: linuxsshlinux-kernelttypty

解决方案


连接的服务器端的 bash 进程正在运行,其控制终端设置为伪终端对的从端,主端连接到该sshd进程。

当连接终止时,sshd进程关闭伪终端的主端,这导致内核伪终端驱动程序挂起伪终端的从端。当从端挂断时,内核 tty 核心向终端的会话领导者(通常是那个进程)SIGHUP和会话领导者进程组中的每个进程发送信号。SIGCONTbash

这并非特定于伪终端和 ssh - 如果您通过连接到串行端口的调制解调器拨入服务器并且调制解调器挂起(这是“挂起”/SIGHUP命名的来源) ,也会发生同样的事情. 如您所知,这是由来已久的历史行为。


推荐阅读