Sudo 找不到二进制文件

Sudo 找不到二进制文件

我有个问题。

最近我已经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
...

因此,二进制文件位于/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
...

如您所见,npm就在那里。为了更容易从命令行使用它,我修复了$PATH内部.bashrc脚本:

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

对根的也是如此.bashrc

# which npm
/opt/node/bin/npm

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

$ sudo which npm
$ sudo npm -g install uglify-js
sudo: npm: command not found

那么,为什么会发生这种情况?我该如何得到我想要的东西?

谢谢。

更新:根据 Paul 的建议,我添加了

Defaults  env_keep = PATH

/etc/sudoers

但问题仍然存在:

$ echo $PATH
... :/opt/node/bin
$ sudo su -
#
# sudo -V
...
Environment variables to preserve:
    XAUTHORIZATION
    XAUTHORITY
    TZ
    PS2
    PS1
    PATH
...

因此,Defaults指令完成了它的工作,但我得到了同样的结果sudo: npm: command not found

答案1

sudo调用新的 shell,传递给新 shell 的环境变量由“/etc/sudoers”文件控制。如果您希望传递路径,则需要添加

Defaults env_keep = "PATH"

到 '/etc/sudoers',它将保留 sudo shell 中的 PATH 环境变量

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

exempt_group = "groupname"

或者用你自己的覆盖 secure_path,例如:

secure_path = "/bin:/usr/bin:/sbin:/usr/sbin:/opt/node/bin"

答案2

我遇到了这个问题 -> 我的问题是由于npm安装在引起的/use/local/bin

我的文件中有这样一行/etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

打字npm是启发性的部分:)

相关内容