即使配置正确,sudo(-E)也不会保留路径

即使配置正确,sudo(-E)也不会保留路径

我使用 virtualenvwrapper 在 python 虚拟环境中安装了 circus,我想用 sudo 运行它。听起来很简单,对吧?不幸的是,即使阅读了man sudoman sudoers,我还是无法让普通用户的 PATH 在 sudo 之后保留下来。Debian 7.8(Wheezy)。

这是 /etc/sudoers:

deploy@devops:~$ sudo cat /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
Defaults    !env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root    ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
deploy ALL=(ALL) NOPASSWD:ALL

这是普通用户的 PATH:

deploy@devops:~$ echo $PATH
/home/deploy/.nix-profile/bin:/home/deploy/.nix-profile/sbin:/home/deploy/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

现在让我们激活虚拟环境并验证它是否改变了 PATH:

deploy@devops:~$ workon circus

(circus)deploy@devops:/srv/circus/project$ echo $PATH
/home/deploy/.virtualenvs/circus/bin:/home/deploy/.nix-profile/bin:/home/deploy/.nix-profile/sbin:/home/deploy/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

很好。现在让我们看看 root 得到的路径是什么:

(circus)deploy@devops:/srv/circus/project$ sudo su
root@devops:/srv/circus/project# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

发生了什么?为什么使用 secure_path?我用感叹号否定了 env_reset。 sudo -E表现出完全相同的行为,如果我这样做,export FOO=bar然后sudo suecho $FOO,我确实得到了 bar...

非常沮丧,非常感谢您的帮助。如果不清楚,很乐意澄清。

答案1

明白了,我已经尝试过sudo env "PATH=$PATH"@william 评论中提到的方法,但令人尴尬的是,我忘了从 visudo 退出编辑器,所以我保存了 .tmp 文件。 脸红

简而言之,设置Defaults !env_reset和使用sudo env "PATH=$PATH"效果很好。感谢您的评论。

相关内容