ssh登录前强制显示banner是唯一可靠方式,必须通过sshd_config中banner指令指向纯文本文件实现,该文件需root所有、权限644、utf-8无bom、lf换行,且须重载sshd服务生效。

SSH登录前强制显示Banner,唯一可靠方式
SSH连接建立后、认证开始前必须显示的提示语,只能靠 Banner 实现。其他方式(比如改 /etc/motd)在密钥自动登录、PrintMotd no 或 PAM 覆盖下大概率不生效。
操作步骤很直接:
- 创建纯文本 Banner 文件:
sudo tee /etc/ssh/banner,内容不能含变量(如$(date)),只支持静态文字 - 编辑
/etc/ssh/sshd_config,取消注释并设置:Banner /etc/ssh/banner - 确认权限:
sudo chmod 644 /etc/ssh/banner;检查编码:file -i /etc/ssh/banner应返回charset=utf-8且无CRLF - 重启服务:
sudo systemctl restart sshd
验证方法:用另一台机器执行 ssh -o ConnectTimeout=5 -o BatchMode=yes user@host 2>/dev/null | head -5,第一行就该是 Banner 内容。
/etc/motd 只在登录成功后显示,且常被绕过
/etc/motd 是登录 shell 启动后才读取的,对密钥免密登录、ForceCommand 或某些 SSH 客户端行为完全不可见。CentOS 7 默认由 PAM 控制,pam_motd.so 可能清空或重写 /run/motd.dynamic,导致你改的 /etc/motd 永远不出现。
如果你仍想用它,得先确认配置没被覆盖:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 检查
grep PrintMotd /etc/ssh/sshd_config—— 若输出no或无结果,/etc/motd就被禁用了 - 检查
ls /etc/update-motd.d/—— 若有可执行脚本(如00-header),它们会优先生成动态内容,覆盖/etc/motd - 若确定要用静态
/etc/motd,确保/etc/pam.d/sshd中有session optional pam_motd.so且无noupdate参数
别碰 /etc/issue 和 /etc/issue.net 用于 SSH
/etc/issue 只对本地 TTY 登录生效,SSH 连接完全不读它;/etc/issue.net 是 SSH 的 fallback 机制,仅在 Banner 未启用且 DebianBanner yes(默认关闭)时才可能触发——CentOS 7 默认不走这条路。
常见误区:
- 改了
/etc/issue却发现 SSH 登录没变化 → 正常,它本来就不管 SSH - 把
\d、\t这类转义序列写进/etc/issue.net→ 无效,sshd 不解析这些(只有 getty 解析/etc/issue) - 以为
/etc/issue.net能替代Banner→ 它不稳定、不可控,审计也不认
动态欢迎语要靠登录后脚本,但有副作用
如果真需要显示 uptime、用户数、时间等动态内容,只能在用户 shell 启动时执行脚本,比如往 /etc/profile 或 /etc/bash.bashrc 末尾加 /usr/local/bin/motd.sh。
但要注意:
- 所有交互式 shell 都会执行它,包括
su -、screen、tmux新会话,容易重复刷屏 - 脚本里不能依赖未初始化的环境变量(如
$HOME在某些场景下为空) - 若配合
PrintLastLog no使用,需手动清理/var/log/lastlog,否则可能干扰登录日志统计 - 无法做到“认证前显示”,安全提示类内容绝不能放这里
真正关键的法律声明、访问警告、合规提示,必须塞进 Banner 文件——这是协议层强制行为,躲不掉,也改不了。










