blog icon indicating copy to clipboard operation
blog copied to clipboard

npm: 使用root 用户执行npm lifecycle 命令时报错

Open SamHwang1990 opened this issue 9 years ago • 0 comments

npm lifecycle 命令在执行前,会判断配置unsafe-perm为true 时才继续,否则会提前退出。

代码参考:

    // lib/utils/lifecycle.js
    unsafe = unsafe || npm.config.get('unsafe-perm')

    if ((wd.indexOf(npm.dir) !== 0 || _incorrectWorkingDirectory(wd, pkg)) &&
        !unsafe && pkg.scripts[stage]) {
      log.warn('lifecycle', logid(pkg, stage), 'cannot run in wd',
        '%s %s (wd=%s)', pkg._id, pkg.scripts[stage], wd
      )
      return cb()
    }

问题的分析参见:Npm install failed with “cannot run in wd”

配置的读取顺序大致参考:npm-config,即cli -> env -> npmrc -> default

default中关于unsafe-perm的初始化如下:

    // lib/config/defaults.js
    'unsafe-perm': process.platform === 'win32' ||
                     process.platform === 'cygwin' ||
                     !(process.getuid && process.setuid &&
                       process.getgid && process.setgid) ||
                     process.getuid() !== 0

针对unix 平台,使用root 用户执行npm 命令时得到的默认值都会是false

我的理解大致是避免以root 的身份去执行lifecycle 命令时可能造成的安全问题。

要避开该问题,只要覆盖default中的初始值即可,比如用cli参数或者npm config set unsafe-perm=true

如果站在项目角度避开该问题,可以采取的措施是在项目中创建.npmrc来覆盖default的配置:

// .npmrc
unsafe-perm = true

但可能需要明确带来的风险。

SamHwang1990 avatar Jan 12 '17 06:01 SamHwang1990