gpt4 book ai didi

c++ - 如何将权限级别从 Linux 上的 C++ 程序提升到 root

转载 作者:太空宇宙 更新时间:2023-11-04 13:00:03 26 4
gpt4 key购买 nike

我想从 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 标志。我怎么能避免每次都做这个改变呢?

最佳答案

不需要调用 setreuid()。可执行文件上的 suid 位就足够了,并且做的事情完全一样。这个 setreuid() 调用最终在这里什么都不做。

您可能需要也可能不需要执行 setgid()setuid() 如果您需要执行其他任何需要执行此操作的操作。

关于c++ - 如何将权限级别从 Linux 上的 C++ 程序提升到 root,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34287868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com