我正在通过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)
。
答案 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
。