如何使用sudo命令提升当前进程的权限?

9

能否使用类似 gksudo 的 sudo 前端来提升当前进程的权限?我知道可以执行以下操作:

sudo cat /etc/passwd-

但我对以下内容感兴趣:

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

我正在使用Python编写程序。我的用例是,我有一个以用户身份运行的程序,但可能会遇到根所有的文件进行读/写。我想提示输入密码,获取root权限,执行所需操作,然后可以选择再次降低权限。
我知道我可以将管理员逻辑和非管理员逻辑分开成不同的进程,然后只需以root身份运行管理员进程(通过某些通信方式--policykit/dbus会很合适)。但我希望有一种更简单(尽管更冒险)的解决方案。
我考虑像运行Solaris的ppriv一样通过sudo来修改当前进程的特权。这似乎是一种hacky-but-workable的往返方法。但据我所知,Linux并没有提供ppriv。
(我很惊讶这还不明显;它似乎是一个常见的需求,并且似乎不会造成安全漏洞,允许在一个进程中升级而不是升级新进程。)

如果sudo适用于你,那么su呢? - Dani
据我所知,su会给我一个用于工作的子shell,这对于交互使用是很好的。但我想提升当前正在运行的进程的权限,而不是一个shell子进程。 - Michael Terry
这并不是一个真正的答案,但我喜欢将OpenSSH源代码作为特权操作和分离的模型。然而,与您的情况不同,我认为ssh守护程序以提升的权限启动,然后选择性地派生较低特权的子进程。 - President James K. Polk
我认为需要做出的主要选择是你想在程序内部处理还是外部处理。如果选择前者,你应该考虑使用像PolicyKit这样的API;而如果选择后者,你应该将问题移交给超级用户,并考虑使用sudo规则或其他类型的操作系统工具。 - raphink
8个回答

4
Aptitude有一个“成为root”的选项。你可能希望看看作者在那里做了什么。

9
有趣。显然,使用sudo命令会重新启动aptitude。他们没有更好的解决方案表明可能不存在更好的解决方法。 - Michael Terry

1

如果您想在程序内部干净地处理管理权限,根据您计划运行程序的操作系统,您可能希望使用PolicyKit而不是sudo。

有关Python的PolicyKit,请参见python-slip

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

sudo -s

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

sudo -i

将使您成为root并提供root的环境,这相当于sudo su -

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

请参见同一主题上ServerFault上的此问题


没错,但那需要将管理员和非管理员代码分开,而我正试图避免这种情况。 - Michael Terry
5
迈克尔,那个分离本身非常重要。 - u0b34a0f6ae
1
我同意这很好。但是我现在正在尽量减少干扰,想知道是否可以在不分离的情况下完成它。 - Michael Terry
请在您的回答中展示如何使用 python-slip。另外,提供的文档链接已过期。 - Jonathan

1

很遗憾,我不知道有什么干净的方法可以做到你想要做的事情。我认为你最好的选择是将程序设置为setuid(或在sudo下运行),然后执行你的“脏”工作并且降低权限,或者fork()并从一个进程中降低权限并保留另一个进程来执行你的root工作。

你要找的是setuid(2)/ setreuid(2)/ setregid(2)/ setgroups(2)调用,但它们都被硬编码为不允许你在调用中获取特权。据我所知,你只能使用它们来“放弃”特权。


嗯,看起来是这样的。唉,我想可能有很好的理由,为什么在调用过程中获得特权比能够重新调用带有特权的东西更糟糕。我会寻找另一种实现我想要的方式。谢谢大家! - Michael Terry

0
echo 'echo tee; echo hee'|sudo -s

输出结果为:

tee
hee

0

你的魔法函数/命令可以是:

sudo su

如果我是在交互式环境下进行操作,那么这样做就没问题了,但我需要以编程的方式来完成这个任务。 - Michael Terry

0

我不喜欢从低权限进程中以root身份运行任意命令的想法。然而,既然你需要这个功能,我想到的一个想法是保留一个setuid 受限制的shell,只能执行你感兴趣的命令。然后,你可以使用subprocess.Popen函数来使用这个受限制的shell运行你的命令,它将以提升的特权运行。


我正在尝试避免必须以root身份“运行另一个进程”。我想要将当前进程作为root运行。 - Michael Terry

0

我在想这个方法是否可行:

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

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

请参阅Sudo手册以获取其他选项。


1
但是这个问题应该在超级用户上提问;-) - raphink

0

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


只有当你已经拥有root权限(或具备CAP_SETUID,但除非你进行特殊的操作,否则普通应用程序不会拥有此权限),才能更改你的UID。 - ephemient
哦,我曾经看过一个例子,它使用PAM进行认证以获得某种特权。我猜root不在其中之一。我会保存这个答案供其他人参考。 - LiraNuna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接