Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-10-21) sudo的path问题

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

我在fedora上安装完node后,接着安装npm,使用了以下命令:

curl [http://npmjs.org/install.sh](http://npmjs.org/install.sh) | sudo sh

却出现以下错误:

npm cannot be installed without nodejs.
Install node first, and then try again.

Maybe node is installed, but not in the PATH?
Note that running as sudo can change envs.

我当前正运行于一个普通用户下,输入node,正常运行。又用su -切换成root,运行node,也正常运行。但在普通用户下执行:

sudo node

却提示:sudo: node: command not found

这可是非常奇怪!


在群里提出这个问题后,有前辈提示说,让我把PATH打印出来。

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/freewind/bin
$ sudo echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/freewind/bin

这两个看起来是一样的,应该不会出问题的啊

再试试which

$ which node
/usr/local/bin/node
$ sudo which node
which :  no node in (/sbin:/bin:/usr/sbin:/usr/bin)

可以看到,此时搜索的PATH变少了,找不到node了。怎么回事?

在万能的stackoverflow上,搜索到了一个同样的问题:http://stackoverflow.com/questions/257616/sudo-changes-path-why

里面说sudo可能因为安全上的原因,不会使用修改过的PATH。好在下面的回答中,给出了一个可行的方案:

alias sudo='sudo env PATH=$PATH'

按这种方式,我把命令改为:

curl http://npmjs.org/install.sh | sudo env PATH=$PATH sh

这样就完全没问题了。

comments powered by Disqus