You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

自定义MOTD脚本导致Ubuntu 22.04 LTS服务器登录失败的排查及备用用户配置咨询

自定义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相关的脚本执行,步骤如下:

  1. 创建备用用户
    先创建一个带home目录、使用bash的用户:

    sudo useradd -m -s /bin/bash backupuser
    

    然后设置密码:

    sudo passwd backupuser
    

    如果需要给这个用户管理员权限,加入sudo组:

    sudo usermod -aG sudo backupuser
    
  2. 禁用该用户的MOTD
    最简单的方法是给用户创建一个.hushlogin文件,这个文件会让bash跳过所有MOTD相关的输出,直接进入shell:

    sudo touch /home/backupuser/.hushlogin
    

    这样就算主用户的MOTD脚本出问题,你也能通过这个备用用户SSH或本地登录,然后去修复问题,不用再折腾Live USB了。

备注:内容来源于stack exchange,提问作者dazzmos

火山引擎 最新活动