我有一个 bash 脚本(x11docker)需要以 root ( docker
) 身份运行一些命令,以及以非特权用户(X 服务器,如Xephyr
)运行一些命令。该脚本有时会提示输入密码。它应该可以在任意 Linux 系统上运行,而无需先配置系统。
有些系统使用su
,有些系统使用sudo
来获取 root 权限。我如何才能识别哪一个有效?我试过sudo -l docker
。那应该告诉我是否sudo docker
允许。不幸的是,即使是这些信息也需要密码。
关键是,root 可能有也可能没有密码(使用时需要密码su -c
),并且sudo
可能允许也可能不允许运行 docker。如何决定由哪一个来完成这项工作(=以 root 权限执行命令)?
检查组 sudo 可能是一个不错的猜测,但并不可靠,因为它没有告诉我是否/etc/sudoers
配置为允许组 sudo 任意 root 访问。此外,即使用户不是组 sudo 成员也docker
可以允许进入。/etc/sudoers
pkexec
应该是一个解决方案,但不可靠。密码提示在控制台上失败,在不同于 的 X 服务器上失败DISPLAY=:0
,在 OpenSuse 上根本失败。
目前,该脚本默认使用su
,并且有一个开关--sudo
允许使用sudo
。有可能,但并不漂亮。
我正在开发一个更新,允许以 root 身份运行脚本,并使用 、logname
和SUDO_USER
检查“真正的”非特权用户PKEXEC_UID
。也不俏皮。
有没有办法知道我是否应该使用su
or sudo
?
答案1
你至少可以测试一下是否root
有密码。在这种情况下,您可能想尝试sudo
:
if [ foo = "$(echo | su -c "echo foo")" ]; then
su -c whatever
else
sudo whatever
fi
答案2
当您在没有其他选项的情况下执行 su 命令时,它会切换到超级用户(或 root 用户)。您必须输入 root 帐户的密码。但这并不是 su 命令的全部功能 – 您可以使用它切换到任何用户帐户。如果执行 su bob 命令,系统将提示您输入 Bob 的密码,并且 shell 将切换到 Bob 的用户帐户。
在 root shell 中运行完命令后,您应该键入 exit 以离开 root shell 并返回到有限权限模式。
Sudo 使用 root 权限运行单个命令。当您执行 sudo 命令时,系统会在以 root 用户身份运行命令之前提示您输入当前用户帐户的密码。默认情况下,Ubuntu 会记住密码十五分钟,并且在十五分钟结束之前不会再次要求输入密码。