如何使用 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-something
、20-else
等)。它们必须使用 visudo
.
进行编辑
visudo /etc/sudoers.d/20-special-proot
示例内容(使用的可执行文件的完整路径是强制性的)
youruser ALL=(ALL) NOPASSWD: /usr/bin/bash /full/path/to/p_root
设置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。
sudo (*)
根据 lior.i 的建议,我也添加了这个选项。
您可以将 sudo
和 bash
作为执行命令的脚本路径前缀,以实现相同的目标。
Popen(['sudo', 'bash', '/path/to/script'])
Popen是值得学习和推荐的执行子流程的方式,尤其是长运行。换句话说,它可以做其他人可以做的任何事情。我发现这样做的原因之一是灵活性和调试。灵活地将子流程与其 parent 完全分离或不分离。默认情况下,如果 parent 被正常终止(SIGINT/Ctrl+C),child 也会收到终止信号。同样,它们也附加在它们的 stdin
、stdout
和 stderr
文件描述符处。也许您想使用一个新的文件描述符来实现一些狡猾的魔法。
如果你使用它,你应该考虑的是不要在生产中使用它。让应用程序用户使用无密码 sudo 是一种安全风险,类似于 运行将所有内容都设置为 root。
我正在 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-something
、20-else
等)。它们必须使用 visudo
.
visudo /etc/sudoers.d/20-special-proot
示例内容(使用的可执行文件的完整路径是强制性的)
youruser ALL=(ALL) NOPASSWD: /usr/bin/bash /full/path/to/p_root
设置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。
sudo (*)
根据 lior.i 的建议,我也添加了这个选项。
您可以将 sudo
和 bash
作为执行命令的脚本路径前缀,以实现相同的目标。
Popen(['sudo', 'bash', '/path/to/script'])
Popen是值得学习和推荐的执行子流程的方式,尤其是长运行。换句话说,它可以做其他人可以做的任何事情。我发现这样做的原因之一是灵活性和调试。灵活地将子流程与其 parent 完全分离或不分离。默认情况下,如果 parent 被正常终止(SIGINT/Ctrl+C),child 也会收到终止信号。同样,它们也附加在它们的 stdin
、stdout
和 stderr
文件描述符处。也许您想使用一个新的文件描述符来实现一些狡猾的魔法。
如果你使用它,你应该考虑的是不要在生产中使用它。让应用程序用户使用无密码 sudo 是一种安全风险,类似于 运行将所有内容都设置为 root。