【问题标题】:C programming - execute another program with sudo privilegesC 编程 - 使用 sudo 权限执行另一个程序
【发布时间】:2023-10-11 07:20:01
【问题描述】:

我有一个 C 程序,可以打开一个 mp3 并在同一文件夹中提取 jpg 图稿。如果我在没有 root 权限的情况下执行此程序,我会崩溃。如果我用 sudo 执行它,它可以正常工作。

现在,我需要另一个 C 程序来启动前一个程序,当它需要为选定的 mp3 提供 jpg 图稿时。

我尝试调用 popen("./firstProgram test.mp3" , "r") 函数或 system("/(absolute path)/firstProgram test.mp3") 函数,即使在命令中使用 sudo 或不是,或者使用相对路径或绝对路径。但似乎没有版本有效。

我怎样才能成功地从第二个程序启动第一个程序?

谢谢!

【问题讨论】:

  • XY problem。找出为什么提取 jpeg 的程序在不是 root 时崩溃并修复它。
  • 不要滥用sudo 特权,尤其是出于安全原因,这很糟糕。你的程序有问题,修复错误是你需要做的。

标签: c linux system sudo popen


【解决方案1】:

fork 然后使用 execl

char sudo[]="/usr/bin/sudo";
char pbin[]="/usr/local/bin/puppet";
NOTICE("running puppet: %s %s",sudo,pbin);
errno=0;
execl(sudo,sudo,pbin,(char *)NULL);
/* we should never get as far as this */

显然我建议阅读man execl 了解更多信息

【讨论】:

    【解决方案2】:

    Unix (Linux) 系统可能永远包含 C 编程手册。请参阅第 2 节“系统调用”。

    这个*页面解释了 Unix 手册的“部分”

    您可以阅读手册的第 2 节“系统调用”

    试试命令:man 2 setuid

    这将为您提供 setuid() 系统调用的手册,我认为这是您想要的。

    该手册页还将列出对可能是您想要的其他相关系统调用的引用。

    请记住,在编译 C 程序并使用执行低级硬件访问的系统调用时,要使用 gcc 的 -O2 或 -O3 选项。手册中有提及。

    最终,setuid() 系统调用会使一个用户启动的正在运行的进程将该正在运行的进程的 UID 更改为以其他用户身份运行。 (例如,您可能会看到 Apache 以“apache”运行,即使它是由 root 启动的)。

    setuid(0) 让你成为 root。

    【讨论】:

      最近更新 更多