这个问题不是重复的在 bash 脚本中忽略 sudo
我正在基于 Ubuntu 14.04 docker 镜像制作 docker 镜像。如您所知,root 是 docker 中的默认用户。当我运行 bash 脚本来安装软件时,得到了
sudo: error in /etc/sudo.conf, line 0 while loading plugin `sudoers_policy'
sudo: /usr/lib/sudo/sudoers.so must be owned by uid 0
sudo: fatal error, unable to load plugins
我已尝试过chown root /usr/lib/sudo/sudoers.so
,但是没有作用。
这种行为很奇怪:
ls (everyone can do this)
sudo ls (you can't do this even if you are root)
因为我正在构建docker镜像,所以我不想安装不相关的软件包来使sudo支持root。但是sudo
有些bash脚本中有很多,所以简单地替换sudo
为空可能不是一个好选择。
所以我想知道是否有任何方法可以只忽略sudo
root 身份
答案1
在您的脚本中,一开始就定义sudo
为一个函数,sudo
如果需要则调用实际函数:
sudo ()
{
[[ $EUID = 0 ]] || set -- command sudo "$@"
"$@"
}
command sudo foo bar
告诉 bash 使用实际sudo
命令而不是函数或别名。$EUID
是有效用户 ID,可能与不同$UID
。
答案2
免责声明:不适用于管道
@muru 的答案的另一种方法是使用别名并检查用户是否为 root。这样可以避免在函数中运行命令以及可能产生的副作用。一种适用于所有 shell 的解决方案(在 Alpine Linux 上测试):
if [ $(id -u) -eq 0 ]; then
alias sudo=eval
fi
在更现代的 shell 上,还可以使用以下命令:
if (( $EUID == 0 )); then
alias sudo=eval
fi