9

是否可以使用 sudo 前端(如 gksudo)来提升当前进程的权限?我知道我可以做到以下几点:

sudo cat /etc/passwd-

但我有兴趣这样做:

sudo-become-root # magic function/command
cat /etc/passwd-

我正在用 Python 编写代码。我的用例是我有一个以用户身份运行的程序,但可能会遇到 root 拥有的要读/写的文件。我想提示输入密码,获得 root 权限,做我需要的,然后有选择地再次删除权限。

我知道我可以将管理逻辑和非管理逻辑分离到单独的进程中,然后以 root 身份运行管理进程(通过一些通信——policykit/dbus 在这里很合适)。但我希望有一个更简单(尽管风险更大)的解决方案。

我正在考虑通过 sudo 运行 Solaris 的 ppriv 来修改当前进程的权限。这似乎是一个 hacky 但可行的往返。但据我所知,linux 不提供 ppriv。

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

4

8 回答 8

3

Aptitude 有一个“成为根”选项。你可能想看看作者在那里做了什么。

于 2009-12-28T17:01:26.290 回答
1

不幸的是,我不知道有一种方法可以干净地做你想做的事情。我认为你最好的选择是制作程序 setuid (或在 sudo 下运行它),然后要么做你的肮脏工作并删除权限,要么 fork() 并从一个进程中删除权限并保留另一个进程来做你的根工作.

您正在寻找的是 setuid(2) / setreuid(2) / setregid(2) / setgroups(2) 调用,但它们都是硬连线的,不允许您在调用过程中获得特权。据我所知,您只能使用它们来“放弃”特权。

于 2009-12-28T18:45:27.250 回答
1

如果您想干净地处理程序内部的管理权限,您可能需要使用PolicyKit而不是 sudo,具体取决于您计划在其上运行程序的操作系统。

对于 Python 的 PolicyKit,请参阅python-slip

否则,有两种方法可以调用 sudo 成为 root:

sudo -s

将使您成为根并保持当前环境(相当于sudo su

sudo -i

也会让你成为 root 并给你 root 的环境(相当于sudo su -

处理该问题的另一种方法是考虑您拥有所需的权限,并让程序的用户选择如何将权限授予您的程序(使用 sudo/setuid/unix 组/其他)。

另请参阅有关同一主题的 ServerFault 上的此问题。

于 2009-12-28T17:00:12.700 回答
0

您想使用 PAM 进行身份验证。这里有一个例子

于 2009-12-28T21:27:08.743 回答
0

我不喜欢能够从较低特权进程以 root 身份运行任意命令的想法。但是,既然您想要它,那么想到的一个想法是保留一个setuid 受限 shell,它只能执行您有兴趣允许的命令。然后,您可以使用这些subprocess.Popen函数使用此受限 shell 运行命令,该 shell 将以提升的权限运行它。

于 2009-12-28T17:03:16.537 回答
0

我想知道这是否可行:

将另一个组添加到您的系统,将脚本安装为根程序,并让 sudoers 文件包含允许该组执行脚本的行。最后将该组添加到需要运行脚本的帐户列表中。

然后脚本只能由 root 或在开始时提供帐户密码后在组中具有特殊组的任何帐户运行。

有关其他选项,请参阅Sudo 手册

于 2009-12-28T17:52:39.010 回答
0

你的魔法功能/命令可能是

sudo su
于 2009-12-28T16:51:55.273 回答
0
echo 'echo tee; echo hee'|sudo -s

输出是:

tee
hee
于 2009-12-28T16:55:21.117 回答