python run命令作为根脚本中的普通用户

时间:2014-09-19 07:03:11

标签: python root

我有一个以root身份启动的python脚本,我无法更改它。

我想知道是否可以将此脚本(或所有脚本)的某些行作为普通用户执行(我不需要root用户来运行它)。

原因是,我使用通知,并且python-notify不能在root中的所有机器上工作(看起来像这样bug

那么,您知道是否可以使用子流程或其他方式更改它?

由于

3 个答案:

答案 0 :(得分:6)

  

我想知道是否有可能将此脚本(或所有脚本)的某些行作为普通用户执行

是的,这是可能的 - 也是个好主意。

Python的os模块具有一组函数,用于设置真实,有效且已保存的用户和组ID,从setegid开始。就Python而言,这些功能究竟取决于您的平台;它只是调用相同名称的C函数。

但POSIX定义了这些功能的作用。有关详细信息,请参阅setuidseteuid,但简短版本为:

  • 如果您想切换到普通用户然后切换回来,请使用seteuidsetreuid来设置有效,真实且有效但未保存的UID。然后再次使用相同的功能将它们设置回root。
  • 如果您想以普通用户身份运行整个脚本,并确保无法恢复root用户,请改用setresuid来设置所有三个。

如果您使用的是Python 3.1及更早版本,则不具备所有这些功能。您仍然可以使用seteuid来回切换有效ID,但是setuid将......嗯,这取决于您的平台,但我认为大多数现代平台都会更改保存和真实,这意味着您可以回来了。如果您阅读链接的POSIX文档,那么POSIX文档中会有一些警告和复杂性。如果您只关心一个平台,则可能需要阅读本地联机帮助页,而不是阅读所有案例,然后尝试确定哪个案例适用于您的平台。

  

那么,您知道是否可以使用子流程或其他方式更改它?

这不是必要的(至少在符合要求的POSIX系统上),但它可以使事情变得更容易或更安全。您可以使用subprocessmultiprocessingos.fork或任何其他机制启动子流程,该流程会立即使用setuid删除权限 - 甚至setresuid放弃恢复其特权的能力。当子进程完成其任务时,它就会退出。

答案 1 :(得分:2)

您需要来自getpwnam模块的PWD,要通过用户名访问用户ID,然后使用os.setuid(),您可以将用户和运行python脚本更改为另一个用户。

import pwd, os
uid = pwd.getpwnam('username')[2] #instead of index 2 you can use pw_uid Attribute
os.setuid(uid)

但请注意,使用setuid会造成巨大的安全漏洞。

答案 2 :(得分:1)

如果脚本以root运行,您可以使用os.setuid将当前UID的流程更改为其他用户(不可撤销)或os.seteuid更改处理当前有效的UID(之后您可以再次使用它将EUID重置为root)。

请注意os.setuid会更改真实和有效的UID - 这就是它不可撤销的原因。

os.seteuid更改了有效的UID。由于真正的UID仍然是root,您仍然可以在以后的脚本中将EUID切换回root