我的Python脚本可以区分是以root用户运行还是通过sudo运行?

Jos*_*ler 5 python sudo rhel environment-variables python-2.x

[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
Run Code Online (Sandbox Code Playgroud)

我正在尝试实现上述行为。如果您担心原因或示例不够充分,请进一步阅读。抱歉,我的舌头很锋利,但我的大多数Stack Exchange问​​题都返回了敌对问题,而不是答案。

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

我已经对此进行了深入研究... 以下是此答案的

if os.geteuid() == 0:
    pass  # sufficient to determine if elevated privileges
Run Code Online (Sandbox Code Playgroud)

但是后来我开始需要访问PATH脚本内部。我注意到

sudo -E env | grep PATH; env | grep PATH
Run Code Online (Sandbox Code Playgroud)

打印不同的PATH值。我发现这是因为的安全政策所致PATH。我还发现了解决方法,以PATHISsudo PATH=$PATH ...

但是,它不是唯一受策略保护的环境变量,因此,为什么要将这种环境变量枚举推送给脚本用户?似乎,root明确要求是最好的方法,root否则仅警告管理员从脚本中明确使用。

有没有办法区分Python rootsudo与Python?

小智 2

尽管讨论了不采用此解决方案的原因,但我实际上确实为其他想知道它是否可能的人找到了它。

[user@hostname ~]$ sudo python
>>> import os
>>> os.environ["SUDO_UID"]  # UID of user running sudo
'uid'
Run Code Online (Sandbox Code Playgroud)

当以 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
Run Code Online (Sandbox Code Playgroud)

我还找到了root一种访问PATH刚刚运行的方法sudo

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

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