python - 我的 Python 脚本能否区分它是以 root 身份运行还是通过 sudo 运行?

标签 python environment-variables python-2.x sudo rhel

[root@hostname ~]# python script.py                  # allow this

[user@hostname ~]$ sudo python script.py             # deny this
[user@hostname ~]$ sudo -E python script.py          # deny this
[user@hostname ~]$ sudo PATH=$PATH python script.py  # deny this
[user@hostname ~]$ python script.py                  # kindly refuse this

我正在尝试实现上述行为。如果您关心原因或示例是否不够充分,请进一步阅读。抱歉我说话尖酸刻薄,但我的大多数 Stack Exchange 问题得到的都是敌意的问题而不是答案。

这个问题源于要求管理员运行我的脚本,但脚本的性质需要 root 的环境变量(而不是 sudo 的)。

我对此进行了深入研究... below is from this answer

if os.geteuid() == 0:
    pass  # sufficient to determine if elevated privileges

但后来我开始需要访问脚本中的 PATH。我注意到了

sudo -E env | grep PATH; env | grep PATH

打印不同的 PATH 值。我发现这是因为 PATH 上的安全策略。我还找到了the workaround PATHsudo PATH=$PATH ...

然而,它并不是唯一受策略保护的环境变量,既然如此,为什么要将环境变量的枚举推送给脚本用户呢?似乎明确要求 root 是最好的方法,否则只需警告管理员从脚本中明确使用 root

Python有没有这样区分rootsudo的方法?

最佳答案

尽管讨论了不寻求此解决方案的原因,但我确实为其他想知道是否 it's possible 的人找到了它。 .

[user@hostname ~]$ sudo python
>>> import os
>>> os.environ["SUDO_UID"]  # UID of user running sudo
'uid'

当以 root 身份登录时...

[root@hostname ~]# python
>>> import os
>>> try:
...     uid = os.environ["SUDO_UID"]
        raise AssertionError("Ran with sudo")
... except KeyError, e:
...     ...  # SUDO_UID, SUDO_USER, etc. not set without sudo

我也是found一种访问 rootPATH 的方法,只需使用 sudo 运行即可。

path = os.popen("su - -c env | grep ^PATH= | cut -d'=' -f2-").read().strip()

我认为我更喜欢这个解决方案,而不是依赖我的脚本的运行方式。

关于python - 我的 Python 脚本能否区分它是以 root 身份运行还是通过 sudo 运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50612898/

相关文章:

python - 编写一个程序,在一行代码中打印从 1 到 100(含)的整数,但是

python - 如何在 python tkinter 的 for 循环中从列表中创建多个复选框

python - 在 pandas 中使用正则表达式验证字符串

python - 使用 MySQL 和 Python 返回基于子查询的元组

python - 在 Python 中使用子进程复制 os.system 功能?

python - __getitem__、__setitem__ 如何处理切片?

python - python中分类变量的knn插补

bash - 如何在 Bash/终端中导出多行环境变量,例如 : RSA Private Key

c# - 如何以编程方式解析命令(例如 gacutil)的路径?

Pythonic 方式将列表拆分为第一个和休息?