Npm Can';t使用sudo安装全局软件包,只有su可以工作

Npm Can';t使用sudo安装全局软件包,只有su可以工作,npm,Npm,我已经安装了Node和NPM $ node -v v0.10.25 $ npm -v 1.3.24 作为普通用户,如果我尝试安装全局软件包,则会出现权限错误: $ npm -g install grunt-cli npm http GET https://registry.npmjs.org/grunt-cli npm http 304 https://registry.npmjs.org/grunt-cli npm ERR! error rolling back Error: EACCES

我已经安装了Node和NPM

$ node -v
v0.10.25

$ npm -v
1.3.24
作为普通用户,如果我尝试安装全局软件包,则会出现权限错误:

$ npm -g install grunt-cli
npm http GET https://registry.npmjs.org/grunt-cli
npm http 304 https://registry.npmjs.org/grunt-cli
npm ERR! error rolling back Error: EACCES, unlink '/usr/local/bin/grunt'
npm ERR! error rolling back  grunt-cli@0.1.13 { [Error: EACCES, unlink '/usr/local/bin/grunt'] errno: 3, code: 'EACCES', path: '/usr/local/bin/grunt' }
npm ERR! Error: EACCES, unlink '/usr/local/bin/grunt'
npm ERR!  { [Error: EACCES, unlink '/usr/local/bin/grunt'] errno: 3, code: 'EACCES', path: '/usr/local/bin/grunt' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.
很公平,让我用
sudo

$ sudo npm -g install grunt-cli
/usr/local/bin/grunt -> /usr/local/lib/node_modules/grunt-cli/bin/grunt
grunt-cli@0.1.13 /usr/local/lib/node_modules/grunt-cli
├── resolve@0.3.1
├── nopt@1.0.10 (abbrev@1.0.4)
└── findup-sync@0.1.2 (lodash@1.0.1, glob@3.1.21)
看起来不错,但现在如果我尝试使用新安装的软件包,我无法:

$ grunt
fs.js:695
  return binding.readlink(pathModule._makeLong(path));
                 ^
Error: EACCES, permission denied '/usr/local/bin/grunt'
    at Object.fs.readlinkSync (fs.js:695:18)
    at Object.realpathSync (fs.js:1283:25)
    at tryFile (module.js:142:15)
    at Function.Module._findPath (module.js:181:18)
    at Function.Module._resolveFilename (module.js:336:25)
    at Function.Module._load (module.js:280:25)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:902:3
令人沮丧。但是,如果我卸载
sudo npm-g uninstall grunt cli
,然后完全切换到root重试,它会工作:

$ sudo su -
root# npm -g install grunt-cli
/usr/local/bin/grunt -> /usr/local/lib/node_modules/grunt-cli/bin/grunt
grunt-cli@0.1.13 /usr/local/lib/node_modules/grunt-cli
├── resolve@0.3.1
├── nopt@1.0.10 (abbrev@1.0.4)
└── findup-sync@0.1.2 (lodash@1.0.1, glob@3.1.21)

^D

$ grunt
grunt-cli: The grunt command line interface. (v0.1.13)

所有全局包(grunt、supervisor等)都会发生这种情况,令人难以置信地沮丧。为什么
sudo
失败了,但是
su
工作了?我能做些什么来修复我的环境?

猜测一下,它可能是umask——您可能有
077
,而root的默认值类似于
022
。因此,对于sudo,创建的文件不是世界可读的,但是对于su,它们是可读的


使用sudo安装时/usr/local/bin/grunt文件的权限/所有权是什么?使用su安装时/usr/local/bin/grunt文件的权限/所有权是什么?

。我的umask是
0027
。根umask是
0022
。通过
sudo
安装:root#ls-l/usr/local/bin/grunt lrwxr-xr-x 1根控制盘,并通过
su
安装:$ls-l/usr/local/bin/grunt lrwxr-x---1根控制盘,因此我想因为我不是控制盘组的成员,所以我无法运行脚本?解决这个问题最安全的方法是什么?@Ryan:我想你把它们倒过来列出了——用
sudo
它不是世界可读的。因此,您需要执行类似于
(umask 022;sudo npm…
)的操作,在具有不同umask的子shell中运行npm。或者npm有一些配置选项来更改umask。谢谢@chris,我确实有它们。显然,NPM有一个umask config选项,但我无法使其保持不变,因此我将我的umask更改为
022
,这解决了问题。很抱歉,noobis,但我不知道如何修复此问题:(我在debian上,我手动创建了我的非root用户,安装了npm-g install grunt cli,但我不能从cli使用grunt…你能更好地解释一下吗?@Pitto:run
umask 022
设置umask/before/running
sudo npm-g install grunt cli