代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

使用sudo安装全局包会在安装后例程期间产生权限错误

  •  0
  • Alexander Mills  · 技术社区  · 6 年前

    我试图在CircleCi上运行此命令:

     sudo npm install -g --loglevel=warn @oresoftware/r2g
    

    我得到这个错误:

    #!/bin/bash -eo pipefail
    sudo npm install -g --loglevel=warn @oresoftware/r2g
    /usr/local/bin/r2g -> /usr/local/lib/node_modules/@oresoftware/r2g/cli/r2g.sh
    /usr/local/bin/r2g_run -> /usr/local/lib/node_modules/@oresoftware/r2g/cli/r2g_run.sh
    /usr/local/bin/r2g_copy_smoke_tester -> /usr/local/lib/node_modules/@oresoftware/r2g/assets/copy_smoke_tester.sh
    
    > @oresoftware/r2g@0.0.132 postinstall /usr/local/lib/node_modules/@oresoftware/r2g
    > ./assets/postinstall.sh
    
    mkdir: cannot create directory ‘/root’: Permission denied
    could not create directory => '/root/.r2g/temp/project'...
    mkdir: cannot create directory ‘/root’: Permission denied
    could not create oresoftware/bash dir.
    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! @oresoftware/r2g@0.0.132 postinstall: `./assets/postinstall.sh`
    npm ERR! Exit status 1
    npm ERR! 
    npm ERR! Failed at the @oresoftware/r2g@0.0.132 postinstall script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
    
    npm ERR! A complete log of this run can be found in:
    npm ERR!     /root/.npm/_logs/2018-06-17T04_41_24_461Z-debug.log
    Exited with code 1
    

    这个问题并不是CircleCI特有的-这发生在Docker或设置了错误权限的任何地方。

    我的问题是-如果我是根用户-我的 $HOME 是/root,运行时为什么会出现权限错误:

    mkdir -p /root/.r2g/temp/project
    

    如你所见,它在第一个目录失败了-我不能创建 /root .即使它已经存在,几乎可以肯定,我应该是根用户,其中/root是我的 $主页 目录。

    有人知道在Linux系统上是否有解决方法吗?是否有一些命令可以作为根目录运行以获取对自己主目录的权限?

    我试图找到一个通用的、不具有强制性的解决方案。

    我以前试过运行这个 npm install 命令:

    sudo chown -R $(whoami) $HOME
    

    那没做什么,同样的错误。

    一个简单的2行dockerfile将产生同样的问题:

    FROM node:10
    RUN npm install -g @oresoftware/r2g
    

    对于这三行Dockerfile,它也会出现同样的错误:

    FROM node:10
    RUN apt-get update && apt-get install -y sudo
    RUN sudo npm install -g @oresoftware/r2g
    

    这是 postinstall.sh script .

    我有 cross-posted this question 到Circleci帮助论坛。

    1 回复  |  直到 6 年前
        1
  •  3
  •   vstm    6 年前

    似乎NPM安装完成了 setuid setgid 对任何人。所以基本上,在运行安装后脚本之前,它会将用户更改为“无人”——一个当然没有写入/root权限的用户。

    为了防止这种情况,您可以设置 --unsafe-perm flag to true 以下内容:

    npm install --unsafe-perm=true -g @oresoftware/r2g
    

    在那之后,它与docker示例一起工作。