【问题标题】:How do I sudo the current process?我如何 sudo 当前进程?
【发布时间】:2010-12-30 12:44:46
【问题描述】:

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

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

【问题讨论】:

  • 如果 sudo 适合你,那么 su 呢?
  • AFAIK,su 会给我一个子外壳来工作。这对于交互式使用来说很好。但我想提升当前运行进程的权限,而不是shell子进程。
  • 这不是一个真正的答案,但我喜欢将 OpenSSH 源代码视为权限操作和分离的模型。但是,与您的 cae 不同,我认为 ssh 守护程序以提升的特权开始,然后选择性地分叉特权较低的孩子。
  • 我认为要做的主要选择是您是想在程序内部还是外部处理这个问题。在第一种情况下,您应该考虑像 PolicyKit 这样的 API,而在第二种情况下,您应该将问题转移给超级用户并考虑使用 sudo 规则或其他类型的操作系统工具。

标签: python linux root gksudo


【解决方案1】:

你的魔法函数/命令可能是

sudo su

【讨论】:

  • 如果我以交互方式执行此操作会很好,但我需要以编程方式执行此操作。
【解决方案2】:
echo 'echo tee; echo hee'|sudo -s

输出是:

tee
hee

【讨论】:

    【解决方案3】:

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

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

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

    sudo -s
    

    会让你root并保持你当前的环境(相当于sudo su

    sudo -i
    

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

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

    另请参阅 this question on ServerFault 关于同一主题。

    【讨论】:

    • 对,但这需要分离管理员和非管理员代码,我试图避免这种情况。
    • 迈克尔,分离本身就非常重要。
    • 我同意很高兴拥有。但我现在正在尝试微创,并且很好奇是否可以在不分离的情况下做到这一点。
    • 请说明如何在您的回答中使用python-slip。此外,提供的文档链接现已过期
    【解决方案4】:

    Aptitude 有一个“成为 root”选项。您不妨看看作者在那里做了什么。

    【讨论】:

    • 有趣。显然 aptitude 只会用 sudo 重新启动。他们没有更好的解决方案这一事实表明没有更好的解决方案。
    【解决方案5】:

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

    【讨论】:

    • 我试图避免以 root 身份“运行另一个进程”。我想以 root 身份运行当前进程。
    【解决方案6】:

    我想知道这是否可行:

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

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

    请参阅Sudo Manual 了解其他选项。

    【讨论】:

    • 但是问题应该出在超级用户身上 ;-)
    【解决方案7】:

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

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

    【讨论】:

    • Yar,似乎是这样。呃,好吧。我想有充分的理由说明在调用过程中获得特权而不是能够重新调用具有特权的东西会更糟。将寻找另一种方式来做我想做的事。谢谢大家!
    【解决方案8】:

    您想通过 PAM 进行身份验证。有一个example here

    【讨论】:

    • 只有在你已经是 root 的情况下才能更改你的 UID(或者有 CAP_SETUID,但除非你经历了特殊的扭曲,否则普通的应用程序不会有这个)。
    • 哦,我曾经看到一些例子,它使用 PAM 进行身份验证以获得某种特权。我猜根不是其中之一。我会为其他人保留这个答案。
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多