如何以编程方式使用 sudo? IE。将 sudo 集成到我的 GUI 中

Posted

技术标签:

【中文标题】如何以编程方式使用 sudo? IE。将 sudo 集成到我的 GUI 中【英文标题】:How can I use sudo programmatically? I.e. integrate sudo into my GUI 【发布时间】:2013-02-16 15:10:35 【问题描述】:

我正在编写一个程序,它在第一次运行时临时需要 root 以执行配置更改(在/etc 中创建一个文件)。

如何通过在图形对话框中询问用户密码来临时获得 root 权限?

该程序使用 Qt,如果它仅适用于 Ubuntu,我相当高兴,但我不想假设他们安装了 gksudo 或其他任何东西。我也不能使用SUID

我唯一能想到的就是提供我自己的密码对话框,并通过system()(或其不那么不安全的表亲之一)将其提供给命令行sudo 二进制文件。

不过,这似乎很老套——命令行前端通常是一个非常糟糕的想法,应该不惜一切代价避免使用。那么有没有更好的方法呢?也许有一个libsudo,或者使用IPC的一些方法?

注意:This is not a duplicate. 或者至少,那里的答案没有将其视为我要问的问题。

【问题讨论】:

【参考方案1】:

来自man sudo

   -A          Normally, if sudo requires a password, it will read it from the
               user's terminal.  If the -A (askpass) option is specified, a
               (possibly graphical) helper program is executed to read the user's
               password and output the password to the standard output.  If the
               SUDO_ASKPASS environment variable is set, it specifies the path to
               the helper program.  Otherwise, if /etc/sudo.conf contains a line
               specifying the askpass program, that value will be used.  For
               example:

                   # Path to askpass helper program
                   Path askpass /usr/X11R6/bin/ssh-askpass

               If no askpass program is available, sudo will exit with an error.

您要么使用安装在许多系统上的 ssh-askpass,要么编写自己的密码提示命令,然后将其提供给 sudo。这仍然有点棘手,但是您不必担心将密码传递给 sudo。

【讨论】:

是的,我想这是一个合理的解决方案。不过还是很hacky,这意味着我不能将我的程序作为一个二进制文件分发。 好吧,从技术上讲,您可以自己成为 askpass 可执行文件并检查 sudo 是否是调用者,然后更改程序的行为,使其充当 askpass 程序。或者,您可以使用某种打包的二进制文件。 sudo -A 可能存在问题:它可能会清除 sudo 超时,从而为脚本中的每个 sudo 调用启动 SUDO_ASKPASS 程序。见Graphically ask for password in a bash script and retain default sudo timeout setting. 我想在 Ubuntu 上为 sudo 编写一个 askpass 程序,它从 libsecret 为当前用户提供密码。我找不到任何文档来解释如何做到这一点。这个程序是独立程序吗?它如何将结果提供给 sudo?是否还有其他必须满足的接口要求?这些是我面临的问题类型的示例,我找不到任何文档。是否需要检查 sudo 的源代码才能得到这些问题的答案?

以上是关于如何以编程方式使用 sudo? IE。将 sudo 集成到我的 GUI 中的主要内容,如果未能解决你的问题,请参考以下文章

Sudo提权漏洞复现

如何以编程方式获得 root 权限?

sudo命令的简单使用

使用java中的jsch在linux中通过sudo命令执行shell脚本以启动服务

通过sudo提权方式控制公司人员权限

Linux操作系统下Sudo命令的使用方法?