如何实现串口控制台断开连接时强制用户登出?
如何实现串口控制台断开连接时强制用户登出?
你要的这个需求其实是让串口控制台(不管是物理串口还是KVM的virsh console)在断开连接时立刻终止当前登录会话,下次连接必须重新登录,和TMOUT那种超时登出的逻辑完全不同对吧?我之前处理过类似场景,给你分两种常见系统环境来说明解决方案:
一、Systemd 系统(如 Ubuntu 16.04+、CentOS 7+ 等)
现在大部分主流Linux发行版都用systemd管理服务,串口控制台对应的是serial-getty@<tty设备>.service:
- 首先确定你的串口设备名,比如常见的
ttyS0、ttyAMA0,你可以用ls /dev/ttyS*查看 - 编辑对应的getty服务配置,执行命令:
systemctl edit serial-getty@ttyS0.service - 在弹出的编辑窗口中,添加或修改
ExecStart行,加上--hangup参数(这个参数的作用是让agetty检测到连接断开时,给登录shell发送SIGHUP信号并终止会话):[Service] ExecStart= ExecStart=/sbin/agetty --hangup -o '-p -- \\u' --keep-baud 115200,38400,9600 ttyS0 $TERM注意:第一行的
ExecStart=是用来清空原有的配置,避免冲突 - 保存退出后,重启服务让配置生效:
systemctl restart serial-getty@ttyS0.service
二、SysVinit 系统(如 CentOS 6、老版本 Debian 等)
针对用传统init的老系统,需要修改inittab配置:
- 编辑
/etc/inittab文件,找到对应串口的getty启动行,类似这样:S0:12345:respawn:/sbin/agetty ttyS0 115200 - 在
agetty后面加上-h参数(这是--hangup的短选项,作用相同),修改后变成:S0:12345:respawn:/sbin/agetty -h ttyS0 115200 - 执行以下命令让inittab的修改立即生效:
init q
验证效果
配置完成后,你可以登录串口控制台,然后主动断开连接(比如virsh控制台按Ctrl+]退出,物理串口直接拔线),再重新连接时,应该会直接看到登录提示符,而不是回到之前的会话,说明配置生效了。
备注:内容来源于stack exchange,提问作者Ani




