You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现串口控制台断开连接时强制用户登出?

如何实现串口控制台断开连接时强制用户登出?

你要的这个需求其实是让串口控制台(不管是物理串口还是KVM的virsh console)在断开连接时立刻终止当前登录会话,下次连接必须重新登录,和TMOUT那种超时登出的逻辑完全不同对吧?我之前处理过类似场景,给你分两种常见系统环境来说明解决方案:

一、Systemd 系统(如 Ubuntu 16.04+、CentOS 7+ 等)

现在大部分主流Linux发行版都用systemd管理服务,串口控制台对应的是serial-getty@<tty设备>.service

  1. 首先确定你的串口设备名,比如常见的ttyS0ttyAMA0,你可以用ls /dev/ttyS*查看
  2. 编辑对应的getty服务配置,执行命令:
    systemctl edit serial-getty@ttyS0.service
    
  3. 在弹出的编辑窗口中,添加或修改ExecStart行,加上--hangup参数(这个参数的作用是让agetty检测到连接断开时,给登录shell发送SIGHUP信号并终止会话):
    [Service]
    ExecStart=
    ExecStart=/sbin/agetty --hangup -o '-p -- \\u' --keep-baud 115200,38400,9600 ttyS0 $TERM
    

    注意:第一行的ExecStart=是用来清空原有的配置,避免冲突

  4. 保存退出后,重启服务让配置生效:
    systemctl restart serial-getty@ttyS0.service
    

二、SysVinit 系统(如 CentOS 6、老版本 Debian 等)

针对用传统init的老系统,需要修改inittab配置:

  1. 编辑/etc/inittab文件,找到对应串口的getty启动行,类似这样:
    S0:12345:respawn:/sbin/agetty ttyS0 115200
    
  2. agetty后面加上-h参数(这是--hangup的短选项,作用相同),修改后变成:
    S0:12345:respawn:/sbin/agetty -h ttyS0 115200
    
  3. 执行以下命令让inittab的修改立即生效:
    init q
    

验证效果

配置完成后,你可以登录串口控制台,然后主动断开连接(比如virsh控制台按Ctrl+]退出,物理串口直接拔线),再重新连接时,应该会直接看到登录提示符,而不是回到之前的会话,说明配置生效了。

备注:内容来源于stack exchange,提问作者Ani

火山引擎 最新活动