无法使用sudo安装全局包,只有su工作

时间:2014-01-24 22:12:27

标签: 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, 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)

这适用于所有全球软件包(咕噜咕噜,主管等)并且非常令人沮丧。为什么sudo失败,但su有效?我该怎么做才能修复我的环境?

1 个答案:

答案 0 :(得分:2)

猜测,它可能是umask - 你可能有077,而root的默认值是022。因此,使用sudo,创建的文件不是世界可读的,但是它们是su。

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