一、简介
linux对文件的权限控制比较严格,这样避免了有特殊意图的程序获取root权限,但在c++程序中希望获取root的执行权限去操作一些只有root可读写的文件。
二、详解
1、setuid法
(1)登录root用户,将程序设置成root:root所有者(等价于:登录root用户编译程序)。也可直接将普通用户加入root组中,那么编译程序不用来回切换用户。
(2)登录root用户设置程序的UID,#chmod u+s App。
(3)程序中使用:
uid_t uid = getuid();
if (setuid(0)) {
return -1;
}
//...
if (setuid(uid)) { //恢复uid
}
通过上面步骤则该用户不管在普通用户还是在root用户下都能获取root权限。
注意:
(1)复制时要想连同其UID位一同复制,cp加参数-a,scp加参数-p。
(2)若复制到其他Linux主机上要保证程序属于root:root所有者。
2、sudo法
在调用系统命令时,使用sudo+管道的方式解决,但必须修改sudo列表。
(1)sudo的配置文件是/etc/sudoers
增加一条配置:
username ALL=(ALL) ALL
这样,普通用户username就能够执行root权限的所有命令
以username用户登录之后,执行: #sudo su -
然后输入username用户自己的密码,就可以切换成root用户了。
(2)程序在调用需要root权限的代码中使用system,echo "userpassword" | sudo -S sh -c "CMD1; CMD2;..."。
注意:可以通过sudo列表控制用户username的操作权限,比如不能修改root密码等。
三、总结
(1)本文仅总结了两种方法,可能还有很多获取root权限方法。
(2)在ArchLinux中加上sudo就等于获取了root权限,这种不在讨论中。
(3)本人思路有限,若有更好的设计建议,也可发邮件沟通,在此先感谢!邮箱地址[email protected]。
本文来自 乌托邦2号 的CSDN 博客 ,
全文地址请点击:https://blog.csdn.net/taiyang1987912/article/details/41113503?utm_source=copy