linux下利用C或C++ 语言调用需要root权限

一、简介

       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

猜你喜欢

转载自blog.csdn.net/qq_16542775/article/details/82845178