Sudo 找不到二进制文件

Nem*_*den 3 linux sudo bashrc

我有个问题。

最近我已经安装了nodejs(如果你不知道它是什么,它并不重要,可以是其他任何东西)从源到 /opt/node:

$ ls -la /opt
...
lrwxrwxrwx  1 root root   11 2012-07-25 13:48 node -> node-0.6.3/
drwxr-xr-x  6 root root 4096 2012-07-25 13:48 node-0.6.3
...
Run Code Online (Sandbox Code Playgroud)

所以,二进制文件在/opt/node/bin

$ ls -la /opt/node/bin
...
lrwxrwxrwx 1 root root      38 2012-06-20 11:44 npm -> ../lib/node_modules/npm/bin/npm-cli.js
...
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,npm在那里。为了更容易从命令行使用它,我$PATH.bashrc脚本中修复了它:

HOME=$HOME:...:/opt/node/bin

对 root 也是如此.bashrc

# which npm
/opt/node/bin/npm
Run Code Online (Sandbox Code Playgroud)

但是如果我用 sudo 运行 npm,npm则找不到:

$ sudo which npm
$ sudo npm -g install uglify-js
sudo: npm: command not found
Run Code Online (Sandbox Code Playgroud)

那么,为什么会这样呢?我如何获得我想要的?

谢谢。

更新:按照保罗的建议,我添加了

Defaults  env_keep = PATH
Run Code Online (Sandbox Code Playgroud)

/etc/sudoers

但问题仍然存在:

$ echo $PATH
... :/opt/node/bin
$ sudo su -
#
# sudo -V
...
Environment variables to preserve:
    XAUTHORIZATION
    XAUTHORITY
    TZ
    PS2
    PS1
    PATH
...
Run Code Online (Sandbox Code Playgroud)

所以,Defaults指令做了它的工作,但我得到了同样的sudo: npm: command not found

Pau*_*aul 7

sudo调用一个新的 shell,传递给新 shell 的环境变量由“/etc/sudoers”文件管理。如果您希望通过您的路径,那么您需要添加

Defaults env_keep = "PATH"
Run Code Online (Sandbox Code Playgroud)

到“/etc/sudoers”,它将在 sudo shell 中保留 PATH 环境变量

如果这不起作用,则路径可能被secure_path指令覆盖(有时,secure_path 被编译为二进制文件)。如果是这样,请尝试添加此命令,将组名替换为您所属的组:

exempt_group = "groupname"
Run Code Online (Sandbox Code Playgroud)

或者用您自己的路径覆盖 secure_path,例如:

secure_path = "/bin:/usr/bin:/sbin:/usr/sbin:/opt/node/bin"
Run Code Online (Sandbox Code Playgroud)