是否可以使用sudo前端(如gksudo)来提升当前进程的权限?我知道我可以做到以下几点:
sudo cat /etc/passwd-
但我有兴趣这样做:
sudo-become-root # magic function/command
cat /etc/passwd-
我正在用Python写作。我的用例是我有一个以用户身份运行的程序,但可能会遇到根目录所有的读/写文件。我想提示输入密码,获得root权限,执行我需要的操作,然后再选择删除权限。
我知道我可以将管理逻辑和非管理逻辑分离到单独的进程中,然后只需以root身份运行管理进程(通过一些通信 - policykit / dbus非常适合这里)。但我希望有一个更简单(虽然承认风险更大)的解决方案。
我正在考虑通过sudo运行Solaris的ppriv然后修改当前进程的权限。这似乎是一个hacky但可行的往返。但据我所知,linux不提供ppriv。
(我很惊讶这已经不是很明显了;这似乎是一个不常见的事情,而且似乎是一个安全漏洞,允许升级进程升级一个新的过程。)
答案 0 :(得分:3)
Aptitude有一个“成为根”选项。您可能希望看到作者在那里做了什么。
答案 1 :(得分:1)
如果您希望在程序中干净地处理管理权限,则可能需要使用PolicyKit而不是sudo,具体取决于您计划运行程序的操作系统。
对于PolicyKit for Python,请参阅python-slip。
否则,有两种方法可以调用sudo成为root:
sudo -s
会让你生根并保持当前的环境(相当于sudo su
)
sudo -i
会让你成为root用户并为你提供root环境(相当于sudo su -
)
解决问题的另一种方法是考虑您拥有所需的权限,并让程序的用户选择如何授予您的程序权限(使用sudo / setuid / unix groups /其他任何内容)。
另请参阅同一主题的this question on ServerFault。
答案 2 :(得分:1)
不幸的是,我不知道如何干净地做你想做的事。我认为你最好的选择是让程序setuid(或在sudo下运行它)然后执行你的脏工作和删除权限,或者fork()并从一个进程中删除权限并保持另一个进程以完成你的root工作
您正在寻找的是setuid(2)/ setreuid(2)/ setregid(2)/ setgroups(2)调用,但它们都是硬连接的,不允许您在调用期间获得权限。据我所知,你只能用它们来“放弃”特权。
答案 3 :(得分:0)
您的魔术功能/命令可能是
sudo su
答案 4 :(得分:0)
echo 'echo tee; echo hee'|sudo -s
输出结果为:
tee
hee
答案 5 :(得分:0)
我不喜欢能够从较低特权进程以root身份运行任意命令的想法。但是,既然你想要它,想到的一个想法就是保留setuid restricted shell,它只能执行你感兴趣的命令。然后,您可以使用subprocess.Popen
函数使用此受限制的shell运行命令,该shell将以提升的权限运行它。
答案 6 :(得分:0)
我想知道这是否有效:
将另一个组添加到系统中,将脚本作为根程序安装,并使sudoers文件包含允许该组执行脚本的行。最后将该组添加到需要运行脚本的帐户列表中。
然后,脚本只能在root或在开始提供帐户密码后在组中具有特殊组的任何帐户运行。
有关其他选项,请参阅Sudo Manual。
答案 7 :(得分:0)
您想要使用PAM进行身份验证。有example here。