我正在用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)
我可以想到两种(*)方法。
[添加一个脚本,../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
第二是设置SetUID。这是文件许可权,允许在拥有所有者许可权的情况下执行脚本。即,这意味着您将../p_root
脚本拥有为root
,并且可以执行该脚本的人(组/其他)将始终以root
的身份运行该脚本。
chown root.yourgroup
chmod u+s ../p_root
chmod o-w ../p_root
同样,此处也有相同的安全隐患。任何可以执行此文件的人(尤其是组或其他人都具有执行权限)将以root
的身份运行内部所有内容。如果特权较低的用户(例如,其他用户)具有写权限,则他们只需编辑文件,即可将自己添加到root
中,然后将PS1
更改为黑底黑字。
根据lior.i的建议,我也添加了此选项。您可以将sudo
和bash
作为执行的命令添加到脚本路径的前缀,以实现相同的目标。
Popen(['sudo', 'bash', '/path/to/script'])
Popen是值得学习的,也是执行子流程的推荐方法,特别是从长远来看。换句话说,它可以做其余的一切。我发现,这样做的原因之一就是灵活性和调试能力。是否完全将子流程与其父流程分离的灵活性。默认情况下,如果父级被优雅地杀死(SIGINT / Ctrl + C),则也将向子级发出死亡信号。同样,它们也附加在其stdin
,stdout
和stderr
文件描述符中。也许您想利用一些新的文件描述符来解决一些魔术。
如果使用此功能,应注意的一点是不在生产中使用它。将无密码sudo留给应用用户会带来安全风险,类似于仅以root用户身份运行所有内容。