python - 我的 Python 脚本能否区分它是以 root 身份运行还是通过 sudo 运行?
问题描述
[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
's 环境变量(而不是sudo
's)。
我已经对此进行了一些深入的研究...以下来自此答案
if os.geteuid() == 0:
pass # sufficient to determine if elevated privileges
但后来我开始需要访问PATH
我的脚本内部。我注意到
sudo -E env | grep PATH; env | grep PATH
打印不同的PATH
值。我发现这是因为PATH
. 我还发现解决方法PATH
是sudo PATH=$PATH ...
但是,它不是唯一受策略保护的环境变量,在这一点上,为什么要将这个环境变量枚举推送给脚本用户呢?似乎root
明确要求是最好的方法,否则只警告管理员root
在脚本中明确使用。
有没有这样的方法来区分root
和sudo
使用 Python?
解决方案
尽管讨论了不追求此解决方案的原因,但实际上我确实为其他想知道它是否可能的人找到了它。
[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
我还找到了一种访问root
's PATH
just running with的方法sudo
。
path = os.popen("su - -c env | grep ^PATH= | cut -d'=' -f2-").read().strip()
我认为我更喜欢这个解决方案,而不是依赖于我的脚本的运行方式。