C编程 - 使用sudo权限执行另一个程序

时间:2018-02-14 15:53:22

标签: c linux system sudo popen

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

现在,我需要另一个C程序,当它需要所选mp3的jpg图片时启动上一个程序。

我试着打电话给popen(" ./ firstProgram test.mp3"," r")功能或系统(" /(绝对路径)/ firstProgram test.mp3& #34;)通过在命令中使用sudo来调用它们,或者使用相对路径或绝对路径来调用它们。但似乎没有版本可行。

如何从第二个程序中成功启动第一个程序?

谢谢!

2 个答案:

答案 0 :(得分:0)

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了解更多信息

答案 1 :(得分:0)

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

这个维基百科页面解释了Unix手册“部分”

您可以阅读有关“系统调用”的手册的第2部分

尝试命令:man 2 setuid

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

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

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

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

setuid(0)让你成为root。