Ubuntu 20.04 上新建账号后 ssh 登录,密码验证通过的瞬间连接断开,客户端提示 Write failed: Broken pipe,auth.log 里写着 User ops not allowed because shell /usr/sbin/nologin does not exist。
真正麻烦的地方在于,几个原因的现象几乎一样。账号的登录 shell 被设成 /usr/sbin/nologin,PAM 直接拒绝;/etc/shells 里没有该 shell 路径,pam_shells 判定不合法;账号被 usermod -s 改过,改的路径在本机不存在。
动手时先看账号的 shell 字段
getent passwd ops
再往下改成可用的登录 shell
usermod -s /bin/bash ops
随后确认 shell 在白名单里
grep -qx /bin/bash /etc/shells || echo /bin/bash >> /etc/shells
等前面都确认过,再重试登录并看认证日志
ssh ops@10.0.0.11; tail -f /var/log/auth.log
同事提醒我看一下最近一次发布,时间点确实对得上。
命令输出我都留了记录,免得改完记不清原来的值。
改之前先确认了最近有没有人动过配置,避免白查一遍。
这次没动代码,只在配置和运行环境上找原因。
改完先别撤,确认这几项。ssh 登录后能进入 bash 提示符,auth.log 里不再出现 not allowed because shell 或 Broken pipe,who 能看到该会话。
给服务账号设 nologin 是对的,但别设成 /usr/sbin/nologin 这种路径而漏了 /etc/shells;排查看 auth.log 比看客户端提示准。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
