Linux:允许用户代表任何其他用户执行特定命令

Linux:允许用户代表任何其他用户执行特定命令

我正在尝试找到一种方法,允许用户 john 代表另一个用户 peter 执行命令(例如 echo),而无需输入密码。

我找到了一个我认为可以回答我的问题的帖子:

john ALL = (ALL) NOPASSWD: /bin/echo

不幸的是,这并没有完全满足我的要求。此命令将命令echo作为执行peter,但在 的上下文中john。这意味着主目录仍然是 的主目录john

作为用户john,如果我运行:“ sudo -u peter echo ~”,则响应为:/home/john。我希望它是/home/peter

su 命令提供了我期望的行为。以 root 身份执行以下命令:su peter -c "echo ~",将得到/home/peter

问题是,如何在su没有 root 权限且不提示输入密码的情况下获取 的行为?

答案1

您需要指定-i标志以使 sudo 读取登录脚本等并按应有的方式设置环境变量。如果不使 sudo 加载环境,则主环境变量不会更新以反映以用户身份运行。

答案2

“sudo -u peter echo ~” 将在执行命令 sudo 之前解释 ~ 的值。尝试

sudo -s -H -u peter echo \$HOME

或者

sudo -i -u peter echo \$HOME

另外,要查看 sudo 设置的所有环境变量,请尝试:

sudo -i -u peter export
# actually, use /usr/bin/env instead of export

更新

使用 -i 或 -s 时,您暗示要运行的 SUDO_COMMAND 是指定用户的 shell 环境。因此,仅允许 /bin/echo 是不够的,必须允许所有 /bin/bash 可用。

似乎 -H 足以设置 HOME 环境变量,但您无法使用 $HOME 来回显它,因为这是 shell 的一个功能。其他程序可能能够通过 getenv() 或类似方法读取 HOME 的值。

sudo -H -u peter  /usr/bin/env | grep SUDO_COMMAND
SUDO_COMMAND=/usr/bin/env

sudo -i -u peter /usr/bin/env | grep SUDO_COMMAND
SUDO_COMMAND=/bin/bash -c /usr/bin/env

相关内容