Linux用户会话泄漏表现为登录后未正常退出,导致systemd-logind残留stale会话、sshd进程僵死等,占用资源并触发PAM或SSH限制;可通过loginctl、ps、who命令识别,根因包括SSH异常断连、shell未退出、logind配置不当及PAM模块缺失,建议启用KillUserProcesses=yes、ClientAlive机制并结合journalctl日志分析定位。

Linux用户会话泄漏通常表现为登录后未正常退出,导致系统中残留大量无效会话(如 login、sshd、systemd-logind 管理的 session),占用资源、影响登录限制策略,甚至触发 PAM 会话数限制或 SSH 连接拒绝。
确认是否存在会话泄漏
使用以下命令快速查看当前活跃用户会话:
-
loginctl list-sessions—— 查看 systemd-logind 管理的所有会话(含 stale 状态) -
loginctl list-users—— 查看已登录用户及其关联会话数 -
ps -eo pid,tty,comm,args | grep -E "(sshd|login)"—— 检查底层进程是否残留(尤其无 TTY 的僵尸会话) -
who或w—— 对比显示的登录用户与loginctl结果,不一致即可能存在泄漏
常见泄漏原因与对应检查点
会话未释放往往不是单一故障,而是多个环节协同失效的结果:
-
SSH 客户端异常断连(如网络中断、客户端崩溃):服务端未收到 FIN 包,sshd 不主动清理会话。需检查
/etc/ssh/sshd_config中ClientAliveInterval和ClientAliveCountMax是否启用并合理设置(例如ClientAliveInterval 60+ClientAliveCountMax 3) -
shell 或终端进程未正常退出(如 Ctrl+Z 挂起后 kill -9 %1,但未退出 login 进程):此时
login进程可能僵死,loginctl显示state: closing或state: lingering却长期不消失 -
systemd-logind 配置限制宽松或异常:检查
/etc/systemd/logind.conf中IdleAction=、IdleActionSec=、KillUserProcesses=设置;若为no,用户登出后子进程(包括后台服务)可能持续运行并“拖住”会话 -
PAM session 模块未正确配对:自定义 PAM 配置(如
/etc/pam.d/sshd)中session [success=ok default=ignore]类规则若跳过pam_systemd.so或pam_loginuid.so,会导致 session 无法被 logind 正确跟踪
手动清理与自动化防护建议
临时清理可直接终止会话,但应优先定位根因:
- 强制终止指定会话:
loginctl terminate-session <session-id>(如c1、2345) - 终止某用户所有会话:
loginctl terminate-user <username> - 重启 logind(谨慎):
sudo systemctl restart systemd-logind—— 会重置所有会话状态,适用于 logind 卡死场景 - 日常防护:启用
KillUserProcesses=yes并配合IdleAction=lock/IdleActionSec=900,可显著减少残留;同时在 SSH 侧启用连接保活和超时(ClientAliveInterval+TCPKeepAlive yes)
日志辅助定位泄漏源头
关键日志位置:
-
journalctl -u systemd-logind -n 100 --no-pager—— 查看会话创建/终止记录,注意Session <id> logged out是否缺失 -
journalctl _COMM=sshd -n 200—— 检查 SSH 认证与连接关闭事件(如Received disconnect from ...后是否跟session closed) -
grep "pam_systemd" /var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS)—— 确认 PAM session 模块是否成功加载










