如何使用 subprocess.Popen 以 root 权限打开进程

how to open process with root privileges using subprocess.Popen

我正在 python 脚本中打开一些子进程,我需要其中之一具有 root 权限。

有没有办法在没有 运行 具有 root 权限的整个脚本的情况下做到这一点?

p1 = "../p1"
p2 = "../p2"
p_root = "../p_root"

proc_P1 = subprocess.Popen(p1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
proc_P2 = subprocess.Popen(p2, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
proc_ROOT = subprocess.Popen(p_root, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

我能想到的有两个(*)方法。

/etc/sudoers.d

添加一个脚本,../p_root 调用成为 sudoers.d 目录中的无密码 sudo 配置。此配置将允许使用无密码 sudo 调用 only ../p_root。您必须锁定脚本写入权限。至少去掉别人的写权限chmod o-w ../p_root。否则,有人可以通过编辑文件并添加自己的内容来利用此和 运行 任意代码作为 root

/etc/sudoers.d 中的每个文件都包含 sudo 的规则。您可以在该目录中添加自己的文件,以合理地管理您的系统。 /etc/sudoers.d 中的文件按顺序读取(惯例是将它们命名为 10-something20-else 等)。它们必须使用 visudo.

进行编辑
visudo /etc/sudoers.d/20-special-proot

示例内容(使用的可执行文件的完整路径是强制性的)

youruser    ALL=(ALL)   NOPASSWD:   /usr/bin/bash /full/path/to/p_root

More details about sudo

设置UID

二是设置SetUID。这是一个文件权限,允许在其所有者的权限下执行脚本。即,这意味着您拥有 root../p_root 脚本,任何可以执行它的人 (group/others) 将始终 运行 脚本作为 root.

chown root.yourgroup 
chmod u+s ../p_root
chmod o-w ../p_root

同样,同样的安全隐患也适用于此。谁能执行这个文件(尤其是组或其他有执行权限的人),就会运行里面的所有东西都变成root。如果低权限用户(例如其他人)具有写入权限,那么他们可以简单地编辑文件,将自己添加到 root 并将您的 PS1 更改为 black on black。

More details

sudo (*)

根据 lior.i 的建议,我也添加了这个选项。
您可以将 sudobash 作为执行命令的脚本路径前缀,以实现相同的目标。

Popen(['sudo', 'bash', '/path/to/script'])

Popen是值得学习和推荐的执行子流程的方式,尤其是长运行。换句话说,它可以做其他人可以做的任何事情。我发现这样做的原因之一是灵活性和调试。灵活地将子流程与其 parent 完全分离或不分离。默认情况下,如果 parent 被正常终止(SIGINT/Ctrl+C),child 也会收到终止信号。同样,它们也附加在它们的 stdinstdoutstderr 文件描述符处。也许您想使用一个新的文件描述符来实现一些狡猾的魔法。

如果你使用它,你应该考虑的是不要在生产中使用它。让应用程序用户使用无密码 sudo 是一种安全风险,类似于 运行将所有内容都设置为 root。