繁体   English   中英

以sudo方式运行python调用

[英]Run python calls as sudo

我们有一个以root身份运行的python安装脚本,当前我们希望以sudoer用户身份(具有一组特权)运行它。 问题是我们的代码充满了os.makedirs和open(filename)等。

open(filename) as sudo ?
os.makedirs as sudo ?
... as sudo ?

不适合我们的解决方案:

  1. 以“ sudo python script.py”运行整个安装脚本。这对我们来说是一个安全问题。 我们需要避免它。

  2. Popen([“ sudo”,“ ...”])这对非unix系统支持不利,并且需要重写所有代码。

我有2号牛肉。 您需要sudo但又需要与平台无关的感觉如何? 如果这确实是您想要的,则必须重新考虑需求1,或者检测到您正在使用的操作系统,并且如果在* nix上,则使用sudo前缀命令。 另外,除了使用sudo运行整个脚本之外,您还必须更改代码,因此#2的一部分是一个静默点。 但是,在Popen命令中使用sudo毫无意义。 您将必须为必须运行的那些特定命令启用无密码sudo,而IMO比仅以UID 0运行整个脚本要冒更大的风险。但是,似乎您只是在与文件系统进行交互,正如有人评论的那样确实引发了一个问题,您是否可以授予用户访问所需文件的权限?

Tl; dr授予运行程序的用户访问这些文件的权限,或者退一步并问自己为什么会遇到此问题,这确实是解决问题的最佳方法

通常,当您的一小段代码必须以提升的特权运行,但是以这种方式运行其余代码并不安全时,您可以执行以下操作:

您以root身份运行主脚本。 但是在启动时,它会分叉或产生一个子进程(该进程仍然是root),然后立即放弃特权。 当您需要以root用户身份进行操作时,可以使用一些足够安全的IPC机制( socketpair可能足够安全,也可能不足够安全,具体取决于设计的其余部分……)要求孩子代您发送并发送回复。 对于Windows,细节有所不同,但是可以使相同的基本思想起作用。


但是,还有其他选择,包括:

  • 创建setuid程序,然后以非根父级的子级身份运行它们。 这个在Windows上不可用,在处理子脚本时在Unix上可能不合适。
  • 将您的应用程序重新设计为一个守护程序/服务(该服务通常由系统的守护程序/服务管理器进行单独管理)并以root身份运行,而主应用程序则通过IPC与该守护程序进行通信。
  • 存储可用于根据需要模拟root的凭据(理想情况下仅用于短暂的子进程或线程)。 这在Windows上效果很好,但在Unix上效果不佳。

但是,在这种情况下,有一个更简单的解决方案:您似乎需要root特权的唯一一件事就是读取(并可能写入?)由其他用户拥有的已安装文件。 只需使这些文件对组可读(并且可能是可写的),然后以该组成员的受限特权用户身份运行脚本即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM