自定义MOTD脚本导致Ubuntu 22.04 LTS服务器登录失败的排查及备用用户配置咨询
一、解决脚本导致登录失败的问题
咱们一步步来排查和修复这个问题:手动运行脚本正常,但放到/etc/profile.d/后登录就立刻注销,主要有几个核心问题需要修正:
1. 脚本中的语法错误
仔细看你的脚本,打印磁盘空间的那行有个笔误:
$PINK-$EOC Disk Space...: $hdBar $storage${GREEN}$storage_percent$EOF
这里的$EOF应该是$EOC(你定义的颜色结束变量),这个语法错误会导致shell执行脚本时直接出错,终止登录流程。
2. 错误使用exec命令
脚本最后处理更新、重启提醒的部分用了exec,比如:
exec /usr/share/unattended-upgrades/update-motd-unattended-upgrades
exec的作用是替换当前的shell进程,当这些子脚本执行完成后,进程就直接结束了——而你的登录shell正是执行这个脚本的进程,所以脚本跑完shell就消失了,自然会立刻注销。
修复方法:把所有exec去掉,直接运行对应的脚本即可,比如改成:
/usr/share/unattended-upgrades/update-motd-unattended-upgrades
3. 脚本放置位置的优化
你现在把脚本放在/etc/profile.d/,这是登录shell(比如bash)启动时会执行的脚本目录,一旦脚本出错就会影响shell启动。更推荐用Ubuntu原生的update-motd机制:
- 把你的脚本移到
/etc/update-motd.d/目录,命名为99-custom-motd.sh(数字越大越晚执行) - 给脚本加执行权限:
sudo chmod +x /etc/update-motd.d/99-custom-motd.sh - 如果你需要恢复默认MOTD内容,给
/etc/update-motd.d/下的其他脚本重新加执行权限:sudo chmod +x /etc/update-motd.d/*
update-motd是由PAM模块在登录前生成并显示信息,不会影响登录shell的启动,就算脚本有问题也不会导致登录失败。
二、创建备用用户避免物理救援
完全可以创建一个备用用户,让它跳过MOTD相关的脚本执行,步骤如下:
创建备用用户
先创建一个带home目录、使用bash的用户:sudo useradd -m -s /bin/bash backupuser然后设置密码:
sudo passwd backupuser如果需要给这个用户管理员权限,加入sudo组:
sudo usermod -aG sudo backupuser禁用该用户的MOTD
最简单的方法是给用户创建一个.hushlogin文件,这个文件会让bash跳过所有MOTD相关的输出,直接进入shell:sudo touch /home/backupuser/.hushlogin这样就算主用户的MOTD脚本出问题,你也能通过这个备用用户SSH或本地登录,然后去修复问题,不用再折腾Live USB了。
备注:内容来源于stack exchange,提问作者dazzmos




