如何对当前进程使用sudo?
有没有办法用一个像 gksudo 这样的工具来提升当前进程的权限?我知道我可以这样做:
sudo cat /etc/passwd-
但我想做的是:
sudo-become-root # magic function/command
cat /etc/passwd-
我在用 Python 写程序。我的需求是,我有一个程序是以用户身份运行的,但可能会遇到一些需要读写的文件,这些文件是属于 root 用户的。我想要提示输入密码,获取 root 权限,完成我的操作,然后再选择性地降低权限。
我知道我可以把管理员的逻辑和非管理员的逻辑分开到不同的进程中,然后让管理员进程以 root 身份运行(可以通过一些通信方式,比如 policykit 或 dbus 来实现)。但我希望能有一个更简单(虽然风险更大)的解决方案。
我在想能不能通过 sudo 来运行 Solaris 的 ppriv,然后修改当前进程的权限。这听起来像是一个有点黑科技但可行的办法。不过据我所知,Linux 并没有提供 ppriv 这个工具。
我很惊讶这个问题还不明显;这似乎是一个不太罕见的需求,而且在进程内提升权限似乎并不是一个安全漏洞,相比于新进程的权限提升。
8 个回答
如果你想在程序中干净利落地处理管理员权限,可能会想用PolicyKit,而不是用sudo,这要看你打算在哪个操作系统上运行你的程序。
关于Python的PolicyKit,可以查看python-slip。
另外,有两种方法可以用sudo来获取root权限:
sudo -s
这个命令会让你成为root用户,并保持你当前的环境(相当于sudo su
)。
sudo -i
这个命令会让你成为root用户,并且给你root用户的环境(相当于sudo su -
)。
还有一种处理这个问题的方法是,考虑你已经拥有所需的权限,让程序的用户选择如何将权限授予你的程序(可以使用sudo/setuid/unix组/其他方式)。
你也可以查看这个ServerFault上的问题,内容和这个主题相关。
Aptitude有一个“成为根用户”的选项。你可能想看看作者在这里做了什么。
很遗憾,我不知道有什么简单的方法可以做到你想要的事情。我觉得你最好的办法是让程序具有setuid权限(或者用sudo来运行它),然后要么直接做你需要的事情并降低权限,要么使用fork()创建一个新进程,从一个进程中降低权限,保留另一个进程来执行需要root权限的工作。
你要找的是setuid(2)、setreuid(2)、setregid(2)和setgroups(2)这些调用,但它们都是被设计成不允许你在执行过程中获得更高权限的。根据我所知道的,你只能用它们来“放弃”权限。