Ubuntu升级Spectre/Meltdown补丁后rc.local中su命令执行失败问题
解决rc.local中su命令因Spectre/Meltdown补丁报错的问题
首先,这个报错su must be ran from a terminal的核心原因是:安装补丁后,部分Ubuntu版本更新了util-linux包(su命令属于这个包),收紧了对交互式终端(TTY)的检测。rc.local是在无TTY的后台环境中执行的,不符合su新的终端要求,所以触发报错;而部分机器正常,大概率是它们的util-linux版本未更新到这个严格检测的版本,或者系统配置存在差异。
下面给你几个可行的解决方法,按推荐程度排序:
方法1:改用sudo替代su(最推荐)
sudo默认支持在非TTY环境下切换用户执行命令,只要目标用户在sudoers配置中允许无密码执行(或者你可以配置免密权限)。
修改rc.local中的命令:
# 原报错命令 su username -c "cd /path/to/repo && git pull" # 替换为sudo命令 sudo -u username bash -c "cd /path/to/repo && git pull"
如果需要免密执行,用visudo打开sudoers文件(避免语法错误导致sudo失效),添加一行:
username ALL=(ALL) NOPASSWD: /bin/bash -c "cd /path/to/repo && git pull"
(如果只是临时测试,也可以用更宽松的配置,但不推荐长期使用:username ALL=(ALL) NOPASSWD: ALL)
方法2:给su添加终端模拟
用script命令模拟一个虚拟终端,让su以为是在终端环境中执行:
script -q -c 'su username -c "cd /path/to/repo && git pull"' /dev/null
参数说明:
-q:静默模式,不输出script的启动/结束日志-c:指定要执行的目标命令/dev/null:把script的日志输出到空设备,避免产生冗余文件
方法3:调整su的执行参数
部分版本的su支持-m保留环境变量、-s强制指定shell的参数,尝试绕过终端检测:
su username -m -s /bin/bash -c "cd /path/to/repo && git pull"
不过这个方法兼容性不如前两种,可能在部分机器上依然无效。
额外排查点
如果想搞清楚部分机器正常的原因,可以对比故障机器和正常机器的:
util-linux版本:执行dpkg -l util-linux查看版本号,故障机器大概率是更新到了更高版本- rc.local的运行环境:检查
systemctl status rc-local.service,确认是否存在环境变量或执行上下文的差异
内容的提问来源于stack exchange,提问作者jamboNum5
相关产品推荐
相关产品推荐

