Linux

sudo (-E) 不保留路徑,即使配置得當

  • August 13, 2015

我使用 virtualenvwrapper 在 python virtualenv 中安裝了馬戲團,我想用 sudo 執行它。聽起來很簡單,對吧?不幸的是,即使在閱讀man sudoand之後man 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

現在讓我們啟動 virtualenv 並驗證它是否已更改 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=barsudo suecho $FOO我確實會得到酒吧……

非常令人沮喪,並感謝任何幫助。如果不清楚,很高興澄清。

知道了,我已經嘗試過sudo env "PATH=$PATH"@william 的評論中提到的,但令人尷尬的是我忘記了從 visudo 退出編輯器,所以我正在保存 .tmp 文件。 臉紅

簡而言之,設置Defaults !env_reset和使用sudo env "PATH=$PATH"效果很好。感謝您的評論。

引用自:https://serverfault.com/questions/713689