如何在脚本中以root身份运行时为用户安装pip包? (的virtualenv)

时间:2017-03-17 08:21:28

标签: python linux pip

我以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.

它没有安装,至少不正确。有什么事我能做到吗?

3 个答案:

答案 0 :(得分:1)

在脚本中,尝试

sudo -i -u newuser pip3 install virtualenv

-i用于登录shell,因此主目录将是newuser's。

答案 1 :(得分: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文件夹,这意味着您正在运行pip3命令{{1}在newuser文件夹中。这就是你HOME的原因。

所以你可以试试这个:

Permission denied

或使用sudo -H -u newuser bash -c 'pip3 install virtualenv'

-H, - set-home

  

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

-i, - login

  

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

查看sudo manpage的更多详情。

答案 2 :(得分:0)

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

请按照以下步骤操作

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

  3. 激活Virtualenv

  4. 你很好!