【问题标题】:How to install pip package for a user when running as root in a script? (virtualenv)在脚本中以 root 身份运行时如何为用户安装 pip 包? (虚拟环境)
【发布时间】:2017-03-17 08:21:27
【问题描述】:

我以usera 登录。我正在尝试从我的主目录运行带有sudo 的脚本,并从pip 为另一个用户(即newuser)安装一些包。

script.sh 我有以下内容:

sudo -u newuser pip3 install virtualenv

所以我输入为usera 的命令看起来像~/.usera: sudo script.sh

由于某种原因,这给了我以下错误:

PermissionError: [Errno 13] Permission denied: '/home/usera/.local'
The directory '/home/usera/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

而且它没有安装,至少没有正确安装。有什么办法可以做到吗?

【问题讨论】:

    标签: python linux pip


    【解决方案1】:

    让我们打印USERHOME

    (venv) ➜  sudo -u new bash -c 'echo $USER'
    new
    (venv) ➜  sudo -u new bash -c 'echo $HOME'
    /Users/old
    

    sudo -u newuser 可以将您的当前用户更改为newuser,但它不会更改您的HOME 文件夹,这意味着您在HOME 文件夹中将pip3 命令作为newuser 运行。这就是为什么你得到了Permission denied

    所以你可以试试这个:

    sudo -H -u newuser bash -c 'pip3 install virtualenv'
    

    或使用-i

    -H, --set-home

    请求安全策略将 HOME 环境变量设置为 目标用户密码数据库指定的主目录 入口。根据政策,这可能是默认行为。

    -i, --login

    运行目标用户密码数据库条目指定的shell 作为登录外壳。这意味着特定于登录的资源文件,例如 因为 .profile 或 .login 将被 shell 读取。如果一个命令是 指定,它通过 shell 的 -c 传递给 shell 执行 选项。如果未指定命令,则执行交互式 shell。 sudo 在运行之前尝试更改到该用户的主目录 贝壳。该命令在类似于 a 的环境中运行 用户将在登录时收到。命令环境部分中的 sudoers(5) 手册记录了 -i 选项如何影响环境 在使用 sudoers 策略时运行命令。

    sudo manpage查看更多详情。

    【讨论】:

      【解决方案2】:

      在脚本中,试试

      sudo -i -u newuser pip3 install virtualenv
      

      -i 用于登录 shell,因此主目录现在将是新用户的。

      【讨论】:

      • 我不知道该放在哪里。我们的想法是让它从脚本中工作,而不必运行其他命令。
      【解决方案3】:

      您需要重新创建您的 virtualenv。不要以 root (sudo) 用户身份创建虚拟环境。

      按照以下步骤操作

      1. 创建文件夹(将所有权限分配给非root用户)
      2. 在文件夹内创建 Virtualenv(不带 sudo)virtualenv venv -p python3

      3. 激活 Virtualenv

      4. 你很好!

      【讨论】:

        猜你喜欢
        • 2021-10-21
        • 2019-09-02
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        • 2013-03-05
        • 2021-10-21
        • 1970-01-01
        • 2021-10-10
        相关资源
        最近更新 更多