如果使用 root,请忽略 bash 脚本中的 sudo

如果使用 root,请忽略 bash 脚本中的 sudo

这个问题不是重复的在 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为空可能不是一个好选择。

所以我想知道是否有任何方法可以只忽略sudoroot 身份

答案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

相关内容