我正在编写一段C代码,它将在sudo
函数调用中运行一些system("sudo ip route ...")
命令。
此调用在主线程创建的pthread中完成,主程序在启动时使用sudo ./program
执行。
当我运行该程序时,Ubuntu会提示我输入无人密码:
[sudo] password for nobody:
我也尝试直接做system("ip route ...")
,但它给了我负面回报意味着它没有被执行。
我应该在线程中做些什么来允许system()
调用使用从主程序继承的sudo
权限?
答案 0 :(得分:5)
您无需执行任何特殊操作即可继承sudo
为您提供的root权限。进程通常会自动继承父进程的权限。 system(3)
无效的原因可能是因为你是root用户(见下文),或者是因为你在线程上。
话虽如此,不要使用system(3)
。这是因为sudo
使用setuid工作,并且与system()
的效果不佳。因此,请改用exec(3)
系列函数(execlp()
和execvp()
除外)。有关详细信息,请参阅man 3 system
。
现在,表示,不要使用system(3)
或 exec(3)
。相反,只需直接调用C API来操作IP表。当你只是简化你的程序时,为什么要浪费系统资源来产生一两个新的过程呢? (此时你已经到了Stack Overflow上你的问题所在的位置。)
答案 1 :(得分:0)
system("echo XXXX | sudo -S gedit");
XXXX你的密码。