我们知道,当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。我不太确定这一点,但根据我的经验,这似乎不是真的。
所以我很好奇谁应该是原始发件人。这有标准吗?
连接服务器端的bash进程正在运行,其控制终端设置为伪终端对的从属端,主端连接到sshd
进程。
当连接终止时,sshd
进程关闭伪终端的主端,这导致内核伪终端驱动程序挂起伪终端的从属端。当从属端挂起时,内核tty核心将SIGHUP
和SIGCONT
信号发送到终端的会话负责人(通常是bash
进程)和会话负责人进程组中的每个进程。
这不是特定于伪终端和ssh - 如果通过连接到串行端口的调制解调器拨入服务器并且调制解调器挂起(这是“挂机”/ SIGHUP
命名源自的地方,则会发生同样的事情) )。你可以说,这是很长时间的历史行为。