我正在尝试找到一种方法,允许用户 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