如何从linux上的c ++程序提升权限级别为root

时间:2015-12-15 11:19:47

标签: c++ linux eclipse userid

我想从C ++代码更改我的默认网关。我使用eclipse作为IDE。以下是我的代码。

//change_gw.cpp
#include <iostream>
#include <unistd.h>

using namespace std;
//To execute terminal commands
std::string exec(char* cmd) {
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[128];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe) != NULL)
            result += buffer;
    }
    pclose(pipe);
    return result;
}

int main() {
    int euid = geteuid();
    int uid = getuid();
    cout<<"euid is "<<euid<<endl;
    cout<<"uid is "<<uid<<endl;
    int result = setreuid(euid,-1); //change the uid to euid (0 - root)
    if(result != 0) {
        cout<<strerror(errno)<<endl;
        return -1;
    }
    string result = exec("sudo route del default");
    if (result == "ERROR") {
        cout<<"del route failed"<<endl;
        return -1;
    }
    result = exec("sudo route add default gw ip dev iface");
    if (result == "ERROR") {
        cout<<"add route failed"<<endl;
        return -1;
    }
    cout<<"route changed succefully"<<endl;
    setreuid(uid,-1); //revert the changes to uid
    return 0;
}

我已经成功编译了这段代码并获得了可执行文件。编译是从eclipse环境完成的。我从终端手动对可执行文件进行了以下更改。

chown root:root change_gw //change the owner to root
chmod u+s change_gw //set user id

现在,当我从eclipse环境运行可执行文件时,我得到以下输出。

euid = 0
uid = 1002
route changed successfully

虽然上面的代码运行正常,但我想知道我正在做的天气是正确和有效的。由于编译是在eclipse环境下完成的,因此可执行文件的用户每次都会从root用户更改为本地用户,每次都需要更改setuserid标志。我怎么能避免每次都做这个改变?

1 个答案:

答案 0 :(得分:0)

不需要setreuid()来电。你的可执行文件上的suid位就足够了,并且完全相同。这个setreuid()电话会在这里无所作为。

如果您还需要执行其他任何操作,则可能需要执行setgid()setuid()