我试图find一种方法来允许用户john代表另一个用户peter执行一个命令(说回声),而不会提示input密码。
我发现一个线程,我认为将是我的问题的答案:
john ALL = (ALL) NOPASSWD: /bin/echo
不幸的是,这不是我想要的。 该命令以peter执行echo命令,但在john的上下文中执行。 这意味着主目录仍然是john目录。
作为用户john ,如果我运行:“ sudo -u peter echo ~ ”,响应是: /home/john 。 我希望它是/home/peter 。
我期待的行为是由su命令提供的。 作为根,如果我这样做: su peter -c "echo ~" ,我得到/home/peter 。
这个问题是,我如何得到su的行为,而不是根,没有提示input密码?
您需要指定-i标志以使sudo读取login脚本等并根据它们设置环境variables。 不使sudo加载环境,home环境variables不会更新以反映用户运行。
“sudo -u peter echo〜”会在执行命令sudo之前解释〜的值。 尝试
sudo -s -H -u peter echo \$HOME
要么
sudo -i -u peter echo \$HOME
另外,要查看由sudo设置的所有环境variables,请尝试:
sudo -i -u peter export # actually, use /usr/bin/env instead of export
UPDATE
使用-i或-s时,暗示要运行的SUDO_COMMAND是指定用户的shell环境。 所以只允许/ bin / echo是不够的,必须允许所有/ bin / bash可用。
看来,-H足以设置HOME环境variables,但是你不能用$ 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