2015-12-15 4 views
0

Я хотел бы изменить мой шлюз по умолчанию из кода на C++. Я использую eclipse как IDE. Следующий мой код.Как повысить уровень привилегий для root из C++-программы на linux

//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. Как я мог каждый раз избегать этого изменения?

+0

http://stackoverflow.com/questions/22733967/linux-how-to-set-default-route-from-c объясняет, как изменить таблицу маршрутов, не переходя через команду. –

+0

Хочешь, чтобы кто-нибудь мог добавить этот маршрут? Если нет, просто оставьте пользователя в качестве локального пользователя, а затем им нужно будет ввести свой пароль, чтобы изменить таблицу маршрутизации. Если вы * сделаете * хотите, чтобы программа была setuid, вам необходимо найти меры предосторожности, которые вы должны предпринять, если не хотите, чтобы это была дыра в безопасности. –

+0

Заключительный комментарий - exec не принимает ни одной строки в качестве аргумента. Вы должны подготовить массив (модифицируемых) строк как argv. –

ответ

0

Звонок setreuid() не нужен. Достаточный бит в вашем исполняемом файле достаточен и делает то же самое. Этот вызов setreuid() заканчивается тем, что ничего не делает здесь.

Возможно, вам понадобится выполнить setgid() или setuid(), если вам нужно что-то еще, что вам нужно.