![Sudo 找不到二进制文件](https://linux22.com/image/1323151/Sudo%20%E6%89%BE%E4%B8%8D%E5%88%B0%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6.png)
我有个问题。
最近我已经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
是启发性的部分:)