c – 在Linux上为Qt应用程序获取root访问权的正确方法
美好的一天 背景: 我正在为Linux系统创建一个OpenVPN包装器应用程序,该应用程序即将完成.我遇到了一些障碍. OpenVPN需要root访问权来修改路由表(添加和删除路由).这是事情变得模糊和混乱的地方. 希望通过扩展this question,可以共享一些行业标准答案和解决方案. 文档: 因此,经过几个小时的搜索,我编制了一个获取root访问权限的可能方法列表,但是似乎没有一个是官方的,也没有任何真正可靠的指导来获得这个SU特权. 让我们考虑以下方法. 1.使用pkexec& polkits 有关最佳做法的一些信息,请查找官方freedesktop polkit documentation here和here 使用pkexec和polkits在线发现了一些教程 关于pkexec和polkits的简要解释(我的理解): > polkits: polkits由行动和规则组成(参见深入阅读和解释的文件).它定义了应用程序的操作以及与之关联的规则.规则可以定义为属于特定组的用户,其中操作查询规则,成功传递规则,用户自动进行身份验证(没有弹出密码提示),否则他们需要输入管理员密码 > pkexec: 用于与polkit操作进行交互并对应用程序进行身份验证以获取root访问权限的应用程序. 这些需要在/usr/share / polkit-1 / actions /和/usr/share/polkit-1/rules.d/中添加操作(在其他目录中,请参阅所有位置的文档) 这种方法似乎很好用(但需要更多的解释才能轻松理解,imo) 注意:有qt-polkit库可供使用,请参阅他们的github repository 对于简单的TL; DR版本,请参阅this 我创建的polkit文件(注意这可能不正确,但它对我有用): 可以找到/添加的位置(还有其他位置)
Policy Kit文件名: 注意:
被称为政策的命名空间(阅读文档,这将不清楚) 政策套件内容
最佳答案
上述错误与现代Linux系统无关.它是对使用setuid而不理解它的愚蠢开发人员的Qt保护. 只需致电
当你的应用程序启动时,你可以做setuid()就好了.您甚至可以在下载到“普通”用户之前运行特权命令. 摘要: 您的Qt应用程序必须具有root所有者,并且setuid位设置.示例debmaker是我想要执行特权操作的Qt应用程序.所以在我建立debmaker之后,我做了:
(后者设置setuid位) 现在运行Qt应用程序
应用程序做的第一件事是检查geteuid()== 0和getuid()== 1000(1000是我的用户ID,0是根) 然后它启动一个新进程(在Qt中使用QProcess).这将以特权模式运行. (示例我的子进程称为chroot) 现在通过调用将主应用程序(我的debmaker)放到正常的用户级别
chroot(子进程)将继续以root用户身份运行. 主应用程序现在不再以提升模式运行,但可以将请求发送到仍在提升模式下运行的子进程.
最后一行将向子进程发送消息.您在子进程中读取stdin,解析命令,检查它以确保它不是恶意的(或恶意取决于您的意图!)并执行命令. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |