我如何sudo当前的过程?

时间:2009-12-28 16:43:43

标签: python linux root gksudo

是否可以使用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。

(我很惊讶这已经不是很明显了;这似乎是一个不常见的事情,而且似乎是一个安全漏洞,允许升级进程升级一个新的过程。)

8 个答案:

答案 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

相关问题