【问题标题】:How to create Python virtual environment with super user privileges如何创建具有超级用户权限的 Python 虚拟环境
【发布时间】:2021-09-13 04:38:04
【问题描述】:

在创建 Python 虚拟环境并激活它之后:

sudo pip install virtualenv

virtualenv venv
source venv/bin/activate 

我可以在虚拟环境中本地 pip install 以及运行其他仍然使用在 ./venv 文件夹内定义的“本地”或“虚拟环境”的 Python 脚本。我要运行的 Python 脚本之一需要 root 用户权限(它尝试设置 os.setegid(1))。尝试运行它会引发错误,要求我以管理员权限运行它。但是当我在python my_script.py 命令前面添加sudo 时,虚拟环境会中断并且不会加载本地安装的模块(在虚拟环境中)。有没有办法在虚拟环境中以超级用户身份(使用 sudo)运行 python 脚本?

下面是 Python sn-p,如果在 Linux 机器上执行会引发 Operation not permitted 错误,要求提供 root 凭据:

import os
os.setegid(1)
OSError: [Errno 1] Operation not permitted

【问题讨论】:

  • sudo which python 只是指向安装在根级别的 python 可执行文件位置。如何在运行命令之前为 root 激活 venv?在什么命令之前?能否请您描述得更详细些。
  • 另外,请发布一个最小的可重现示例

标签: python virtualenv


【解决方案1】:

你的问题有点含糊。

如果你想将所有用户模块复制到 venv,试试这个

  • 在没有 venv 的用户中,在 venv 文件夹 pip freeze > requirements.txt 中执行此操作
  • 激活 venv 并执行此操作pip install -r requirements.txt 这应该将所有用户模块安装到 venv 中

如果你想将你的 python 脚本提升为 sudo,试试这个

chmod 740 my_script.py

我不是 linux 用户,所以我可能使用了错误的 chmod 号码,请使用适当的号码来提升用户隐私,但希望你明白要点 chmod 见here

编辑:

尝试在您的 python 脚本中执行此操作

os.chmod(path, mode);

模式选项:

stat.S_ISUID − Set user ID on execution.

stat.S_ISGID − Set group ID on execution.

stat.S_ENFMT − Record locking enforced.

stat.S_ISVTX − Save text image after execution.

stat.S_IREAD − Read by owner.

stat.S_IWRITE − Write by owner.

stat.S_IEXEC − Execute by owner.

stat.S_IRWXU − Read, write, and execute by owner.

stat.S_IRUSR − Read by owner.

stat.S_IWUSR − Write by owner.

stat.S_IXUSR − Execute by owner.

stat.S_IRWXG − Read, write, and execute by group.

stat.S_IRGRP − Read by group.

stat.S_IWGRP − Write by group.

stat.S_IXGRP − Execute by group.

stat.S_IRWXO − Read, write, and execute by others.

stat.S_IROTH − Read by others.

stat.S_IWOTH − Write by others.

stat.S_IXOTH − Execute by others.

示例用法

os.chmod("path_to/my_script.py", S_IXUSR);

【讨论】:

  • 很遗憾,使用chmod 740 设置脚本无济于事。
  • os.chmod("path_to/my_script.py", S_IXUSR); 将文件权限设置为 ---x------ 。另外,S_IXUSRstat 模块的一部分,需要先导入。最后,Python 行不会以分号结尾 - ; 最后会引发异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2021-09-19
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多