sudo - 使用 system() 在 C 中执行 sudo 命令

标签 sudo root c

我正在编写一段 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/

相关文章:

macos - 以 root 身份运行应用程序的 Apple 脚本

c - klish - 动态变量和完成

linux - 为什么 sudo 在进程组内生成时不起作用?

emacs - Eshell sudo 不接受选项

mysql - 无法登录root用户

ssh - 使用 WinSCP 使用 Root 登录到 Google Compute Engine 虚拟机实例时获取 "Received too large SFTP packet"

C 3d 字符数组

使用 strtol() :\0' or '\n'? 从字符串转换为 int

ios - 使用 NMSSH 库为 "sudo"命令提供密码

android - 如何通过 Android SDK 获得 root 权限?