Banner必须通过sshd_config中Banner指令显式启用,且文件路径需为系统可信目录、权限严格设为644且属主root、编码为UTF-8无BOM且行尾为LF,任一不符则sshd静默跳过加载,不报错也不fallback。

必须用 Banner 指令配置,且文件路径、权限、编码三者任一出错,sshd 都会静默跳过——它不报错,也不 fallback 到 /etc/issue.net 或其他文件。
为什么改了 /etc/motd 或 /etc/issue 却看不到提示
/etc/motd 是登录后才显示的,而 SSH 客户端(尤其是密钥自动登录)可能根本不触发它;/etc/issue 只对本地 TTY 有效,SSH 远程连接默认完全忽略它。真正能在用户输入用户名之前强制弹出的,只有 Banner 配置项指定的文件。
-
PrintMotd no在多数发行版中默认开启,直接禁用/etc/motd -
/etc/issue.net仅在未启用Banner时才作为 fallback,一旦Banner行存在且路径合法,它就彻底失效 - Ubuntu 的
/etc/update-motd.d/脚本输出更不可控,常覆盖或干扰法律声明的视觉焦点
怎么写 Banner 文件才不会被 sshd 拒绝
sshd 对 Banner 文件极其挑剔:权限不对、编码含 BOM、行尾是 CRLF,全都会导致加载失败。
- 路径必须是绝对路径,不能是符号链接(上级目录如
/etc/ssh权限也不能是 777) - 权限必须为
644,属主属组为root:root;600或640会被拒绝读取 - 文件必须是 UTF-8 无 BOM 编码,行尾为 LF(Unix 换行),
file -i /etc/ssh/banner应返回charset=utf-8且不含with CRLF - 内容里不能有
\r、\n等转义符,也不能含中文控制字符(如零宽空格)
怎么验证 Banner 是否真正在协议层生效
别只用 ssh user@host 测试——本地 loopback 可能绕过网络栈,且登录成功后看到的是 motd,不是 Banner。必须从外部机器用原始协议工具抓取握手响应。
- 运行
nc -v your-server-ip 22,首行应立即出现你写的纯文本 Banner 内容 - 若只看到
SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2,说明Banner未生效,或被DebianBanner yes覆盖 - 若看到空白或旧系统信息,大概率是
/etc/issue.net被误读(因为Banner配置有语法错误,sshd 自动降级) - 确认
/etc/ssh/sshd_config中没有其他Banner行重复定义(多行会导致解析失败)
最易被忽略的是编码和换行——哪怕 Banner 文件内容一字不差,Windows 下编辑保存的 \r\n 也会让 sshd 完全无视它,且不给任何日志提示。


















