众所周知,当ssh连接断开时,bash将收到SIGHUP,并将此信号转发给它的所有子级。

我不知道谁是此SIGHUP的原始发送者,是ssh客户端,ssh服务器,操作系统还是其他?

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

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

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

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

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

最佳答案

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

连接终止后,sshd进程关闭伪终端的主端,这导致内核伪终端驱动程序挂起了伪终端的从属端。当从属端挂断时,内核tty内核将SIGHUPSIGCONT信号发送到终端的 session 负责人(通常是bash进程)以及 session 负责人的进程组中的每个进程。

这不是伪终端和ssh特有的-如果您通过连接到串行端口的调制解调器拨入服务器,并且调制解调器挂起(这是“挂断”/SIGHUP命名的来源),则会发生相同的情况)。如您所知,这是历史悠久的行为。

关于linux - ssh连接关闭时,SIGHUP的原始发送者是谁?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55012153/

10-11 19:13