请求<strike> root </strike>密码以获得所需的权限

时间:2013-04-26 07:31:59

标签: c++ c linux permissions linux-kernel

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

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

此致

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

请注意,如果您拥有CAP_SETUID权限,则不需要用户密码;任何密码检查都必须由调用setuid的程序完成。


允许程序加载内核模块的“正确”方法是编写一个简单的帮助程序,该程序 nothing 但加载模块,并将该帮助程序安装为set-user-ID-根

答案 2 :(得分:1)

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

这是sudo(它是图形用户界面的朋友)的用途。如果用户无法将自己置于sudoers文件中,则他无权知道root的密码。如果系统上没有sudo,那么它可能应该拥有它 - 它比使用root作为用户的一切更安全。在我的家庭计算机上,我每天都使用sudo,但我很少以root身份登录。我认为这完全是应该的。

答案 3 :(得分:0)

嗯,我不确定KDE,但Gnome的版本是/usr/bin/gksudo。这具有你的gnome密钥环的附加优势,它可以(根据你如何配置它)将密码缓存30分钟或一些这样的密码,这样你就不必重复输入密码。请注意,您必须位于/etc/sudoers