我使用的是 Ubuntu 14.04。我无法使用 sudo 在 $PATH 中获取命令。我已将其添加到我的 /root/.profile 文件中
# ~/.profile: executed by Bourne-compatible login shells.
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
export PATH=$PATH:/usr/local/rvm/rubies/default/bin
mesg n
我已注销并以具有 sudo 权限的用户身份重新登录。然后我尝试在 $PATH 中运行该命令,但出现“找不到命令”...
daveuser@mymachine:/home/rails/myproject$ sudo gem pristine --all
sudo: gem: command not found
daveuser@mymachine:/home/rails/myproject$ sudo echo $PATH
/usr/local/rvm/gems/ruby-2.3.0/bin:/usr/local/rvm/gems/ruby-2.3.0@global/bin:/usr/local/rvm/rubies/ruby-2.3.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/ bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/rvm/bin
daveuser@mymachine:/home/rails/myproject$ sudo which gem
daveuser@mymachine:/home/rails/myproject$ which gem
/usr/local/rvm/rubies/ruby-2.3.0/bin/gem
请注意,当我 echo $PATH 时,我准确地得到了“gem”命令所在的 PATH。当我以 sudo 用户身份运行命令时,我还需要做什么才能让我的“gem”命令被识别?
编辑:保留环境不起作用。这就是发生的事情……
remoteuser@remotemachine:/home/rails/myproject$ sudo --preserve-env gem pristine --all
[sudo] password for remoteuser:
sudo: gem: command not found
编辑2:sudo -l 的输出
remoteuser@rtemotemachine:/home/rails/myproject$ sudo -l
Matching Defaults entries for remoteuser on rtemotemachine:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User remoteuser may run the following commands on rtemotemachine:
(ALL : ALL) ALL
答案1
默认情况下 sudo 出于安全原因重置环境变量,请检查 /etc/sudoers 中的以下行
Defaults env_reset
PATH 变量重置为“secure_path”值。
e.g. Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
你可以试试
sudo env "PATH=$PATH" [command]
保留 sudo -E 的路径不起作用。
可以找到更好的解释这里
答案2
使用
sudo --preserve-env
-E, --preserve-env 指示用户希望保留其现有环境变量的安全策略。如果用户没有保护环境的权限,安全策略可能会返回错误。