Linux
sudo (-E) 不保留路徑,即使配置得當
我使用 virtualenvwrapper 在 python virtualenv 中安裝了馬戲團,我想用 sudo 執行它。聽起來很簡單,對吧?不幸的是,即使在閱讀
man sudo
and之後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=bar
話sudo su
,echo $FOO
我確實會得到酒吧……非常令人沮喪,並感謝任何幫助。如果不清楚,很高興澄清。
知道了,我已經嘗試過
sudo env "PATH=$PATH"
@william 的評論中提到的,但令人尷尬的是我忘記了從 visudo 退出編輯器,所以我正在保存 .tmp 文件。 臉紅簡而言之,設置
Defaults !env_reset
和使用sudo env "PATH=$PATH"
效果很好。感謝您的評論。