我正在编写一段 C 代码,它将在 system("sudo ip route ...")
函数调用中运行一些 sudo
命令。
这个调用是在主线程创建的 pthread 中完成的,主程序在启动时使用 sudo ./program
执行。
当我运行该程序时,Ubuntu 会提示我输入 nobody 密码:
[sudo] 密码:
我也尝试直接执行 system("ip route ...")
但它给我负的返回意味着它没有被执行。
我应该在线程中做什么才能让 system()
调用使用从主程序继承的 sudo
权限?
最佳答案
您无需执行任何特殊操作即可继承 sudo
授予您的根权限。进程通常会自动继承其父进程的特权。 system(3)
不工作的原因可能是因为您是 root(见下文)或因为您在线程上。
也就是说,不要使用 system(3)
。这是因为 sudo
是通过使用 setuid 来工作的,而 system()
不能很好地发挥作用。因此,请改用 exec(3)
函数系列(execlp()
和 execvp()
除外)。参见 man 3 system
获取更多信息。
现在,根据那个,不要使用system(3)
或 exec(3)
。相反,只需直接调用 C API 来操作 IP 表。当您可以简化您的程序时,为什么要浪费系统资源来产生一两个新进程呢? (虽然此时您已经到了您的问题属于 Stack Overflow 的地步)。
关于sudo - 使用 system() 在 C 中执行 sudo 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29456701/