linux - 当 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。我不太确定这一点,但根据我的经验,这似乎不是真的。
所以我很好奇谁应该是原始发件人。有这方面的标准吗?
解决方案
连接的服务器端的 bash 进程正在运行,其控制终端设置为伪终端对的从端,主端连接到该sshd
进程。
当连接终止时,sshd
进程关闭伪终端的主端,这导致内核伪终端驱动程序挂起伪终端的从端。当从端挂断时,内核 tty 核心向终端的会话领导者(通常是那个进程)SIGHUP
和会话领导者进程组中的每个进程发送信号。SIGCONT
bash
这并非特定于伪终端和 ssh - 如果您通过连接到串行端口的调制解调器拨入服务器并且调制解调器挂起(这是“挂起”/SIGHUP
命名的来源) ,也会发生同样的事情. 如您所知,这是由来已久的历史行为。
推荐阅读
- react-native - React-Native/Expo 中的加速度计问题
- react-native - 在本机反应中将图像转换为base64
- python - 避免在python中将<字符写入XML
- django - 如何在 Django-Template 中处理多个操作
- architecture - 在特定设备上开发 Linux C++ 程序
- wordpress - aws centos 7 wordpress apache重定向
- android - 从本地数据存储解析查询后出错
- java - 玩框架 2,使用 pac4j 制作基于 sql 的自定义身份验证器
- python - 在Raspberry pi上安装Google Assistant SDK时如何解决“bash:src/examples/voice/assistant_grpc_demo.py:没有这样的文件或目录”
- javascript - 插入逗号时拆分字符串并将其添加到字符串数组