1

我正在通过 libkmod ( https://github.com/profusion/kmod ) 从我的应用程序中加载一个 Linux 内核模块,并且一切正常(因为模块在我想要的时候被加载和卸载),但为了实现这一点,我需要以 root 身份(或特权用户,例如 sudoers)运行我的整个程序。我希望能够以普通用户身份加载应用程序,然后询问root用户的密码(用户在 sudoers 中),setuid(0);只是为了加载模块然后恢复旧的 uid。

我的问题是:如何通过某种 UI 对话框(当我尝试通过 KDE 的控制面板更改某些内容时出现的那个)询问root用户的密码?

问候

编辑:我不会接受像system("kdesu/gksu my_app")orpopen()和 family 这样的方法。我正在寻找一种调用密码提示的编程方式。我也不会接受特定于 DE 的答案(请参阅 kdesu 和 gksu)。我正在寻找适用于每个符合 XDG 的 DE 的东西。最后,不需要密码提示存在。我可以在 Qt 中创建一个简单的对话框并询问密码,然后用它来调用任何接受它的函数,比如setuid('password', 0).

4

4 回答 4

2

仅仅知道用户的密码对调用没有用,setuid因为您需要CAP_SETUID更改 uid 的权限(这通常意味着您需要是 root)。

请注意,如果您有CAP_SETUID权限,则不需要用户密码;任何密码检查都必须由调用setuid.


允许您的程序加载内核模块的“正确”方法是编写一个简单的帮助程序,除了加载模块之外什么都不做,并将该帮助程序安装为 set-user-ID-root。

于 2013-04-29T11:45:02.063 回答
2

您可以用来pam进行身份验证。示例http://www.freebsd.org/doc/en/articles/pam/pam-sample-appl.html

于 2013-04-28T15:39:25.553 回答
1

您不想询问 root 密码。我曾在我没有 root 访问权限的系统上工作,但我确实有sudo权限。这并不少见 - 特别是如果sudoers设置为只允许一小组命令。

这就是sudo(它是图形用户界面的朋友)的用途。如果用户无法进入该sudoers文件,则他无权知道 root 的密码。如果系统没有sudo安装它,那么它可能应该安装它 - 这是一个比root作为用户使用所有东西更安全的解决方案。在我的家用机器上,我sudo每天都使用,但很少以root. 我认为这正是应该的。

于 2013-04-26T08:57:04.117 回答
0

嗯,我不确定 KDE,但 Gnome 的版本是/usr/bin/gksudo. 这具有您的 gnome 密钥环的额外优势,它可以(根据您的配置方式)将该密码缓存 30 分钟或一些这样的时间,这样您就不必重复输入它。请注意,您必须在/etc/sudoers.

于 2013-04-26T07:36:52.077 回答