我的 $PATH 中有一個命令,但當我使用 sudo 時它沒有被識別

我的 $PATH 中有一個命令,但當我使用 sudo 時它沒有被識別

我使用的是 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 指示使用者希望保留其現有環境變數的安全策略。如果使用者沒有保護環境的權限,安全性原則可能會回傳錯誤。

相關內容