Я хотел бы изменить мой шлюз по умолчанию из кода на 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. Как я мог каждый раз избегать этого изменения?
http://stackoverflow.com/questions/22733967/linux-how-to-set-default-route-from-c объясняет, как изменить таблицу маршрутов, не переходя через команду. –
Хочешь, чтобы кто-нибудь мог добавить этот маршрут? Если нет, просто оставьте пользователя в качестве локального пользователя, а затем им нужно будет ввести свой пароль, чтобы изменить таблицу маршрутизации. Если вы * сделаете * хотите, чтобы программа была setuid, вам необходимо найти меры предосторожности, которые вы должны предпринять, если не хотите, чтобы это была дыра в безопасности. –
Заключительный комментарий - exec не принимает ни одной строки в качестве аргумента. Вы должны подготовить массив (модифицируемых) строк как argv. –