/etc/issue仅对本地终端生效,ssh需配置/etc/issue.net与banner;二者独立,/etc/issue支持转义序列,/etc/issue.net不支持;修改后立即生效但需匹配登录方式,否则无效。

/etc/issue 是本地终端登录前唯一生效的文件
直接改 /etc/issue 就行,它在用户敲用户名之前、tty login 提示符出现前显示,不依赖 SSH 或 PAM,也不需要重启服务。但只对物理机、虚拟控制台(Ctrl+Alt+F1~F6)、串口登录等本地交互终端有效,SSH 连接默认不读它。
-
/etc/issue支持转义序列,比如\n(主机名)、\r(内核版本)、\t(当前时间),写进去会自动展开 - 别用中文或特殊符号——某些终端(尤其是旧版 busybox login)不支持 UTF-8,可能显示乱码或截断
- 编辑后立即生效,无需重启任何服务;但已登录的 tty 不会刷新,新打开的终端才看到
- 权限必须是
-rw-r--r--且属主为 root,否则 login 程序会静默忽略
/etc/issue.net 控制 SSH 连接建立后的首屏提示
SSH 用户在 TCP 连接成功、输入用户名之前看到的内容,来自 /etc/issue.net —— 注意:它和 /etc/issue 是两个独立文件,且 /etc/issue.net 不支持转义序列(\n、\r 等会被原样打印,不是换行或主机名)。
- 要让它生效,必须在
/etc/ssh/sshd_config中启用Banner:取消注释并设为Banner /etc/issue.net - 改完配置后必须重载 SSH:
sudo systemctl reload ssh(不是 restart,避免断开现有连接) - 如果同时配置了
Banner和/etc/issue.net,Banner优先级更高,/etc/issue.net会被完全跳过 - 某些发行版(如 Ubuntu 22.04+)默认禁用
Banner,且/etc/issue.net为空,所以你改了也看不到
为什么改了 /etc/issue 却没显示?常见陷阱
最常被忽略的是登录方式本身——你用的是 SSH 还是本地 tty?很多用户在 Xshell 或 Terminal 里测试 /etc/issue,当然没反应,因为它压根不走这条路。
- 验证是否在本地终端:按
Ctrl+Alt+F2切到纯命令行 tty,看 login 提示前有没有你的内容 - 检查
login是否被替代:某些容器或精简系统用getty+ 自定义脚本,绕过了标准 issue 读取逻辑 - 确认没有被 PAM 覆盖:
/etc/pam.d/login里若加载了pam_issue.so,它可能从别的路径读取内容,覆盖/etc/issue - systemd 系统中,
logind.conf的NAutoVTs=设置过小(如设成 1),会导致只开一个 tty,其他 F 键切不到,误以为没生效
想统一所有登录入口?Banner 是最可靠的起点
如果你管的是 SSH 服务器,又希望用户在输密码前就看到法律声明或安全警告,Banner 是唯一协议层强制触发的方式。它不依赖 shell、不被 motd 覆盖、不因 PrintMotd 设置而失效。
- 创建独立 Banner 文件,比如
/etc/ssh/banner.txt,内容纯文本,别加变量或命令 - 在
/etc/ssh/sshd_config中明确写Banner /etc/ssh/banner.txt,不要留空格或引号 - 注意:Banner 内容长度建议控制在 50 行以内,过长可能被客户端截断(OpenSSH 默认限制 4KB)
- 改完务必执行
sudo sshd -t校验配置语法,再reload,否则可能锁死自己











