如何在Linux上使用C执行期间切换用户

时间:2017-10-17 03:24:42

标签: c linux posix

我在Linux上使用C编写应用程序。在我的应用程序中,我需要在开始时使用普通用户(非root用户)执行一些任务,同时我还需要在执行过程中与root用户执行一些任务。

顺便说一句,我无法修改普通用户的配置。所以我无法将普通用户添加到sudoers。我也无法修改任何操作系统配置。

我的应用程序真正做的是执行应用程序,获取其输出以进行分析。

某些应用程序需要使用root运行。我使用多线程并行执行和分析这些应用程序的输出,然后将每个应用程序的报告存储在一个名为Report的单例中。我在子流程中使用execvp调用这些应用程序。

我的应用程序的主要目的是自动化软件测试。并且大多数任务都需要在软件所有者中运行,而不是root用户。

所以,问题是

  • 如何在执行期间切换用户?
  • 无论如何,我可以在1个可执行文件中实现它吗?
  • 使用POSIX API做得更好。
  • 使用普通用户运行我的应用程序,为我的应用程序提供root密码,使用root密码切换到root。

1 个答案:

答案 0 :(得分:4)

详细了解 setuid可执行文件以及setreuid(2)execve(2)系统调用。请注意,在更改其所有权(使用chmod(1))和代码后,您需要使用chmod u+s(请参阅chown(1))将setuid标记放在可执行文件上< / strong>避免security holes

(所以我建议让知道setuid机制并了解安全问题的人审核您的代码)

Setuid是susudosuperlogin等......用于获取(或撤销)权限的基本机制。见credentials(7)&amp; capabilities(7)

启动一些帮助程序进程可能更安全(作为root,或者在/usr/libexec/中启动一些setuid可执行文件...)并使用一些inter-process communication工具与pipe(7)进行通信} ...)。例如,建议不要在根进程中使用GTK或Qt等GUI工具包。如果你的应用程序有一些GUI,那么在非root(普通用户)进程中运行它的GUI是合理的,并且以root(希望很小的)辅助进程运行,从而完成需要特殊权限的实际工作。

在编码之前,我建议您阅读一本好书,例如Advanced Linux Programmingsyscalls(2)以及您将使用的每个system call的文档。 Security方面尤其重要。

Setuid可执行文件不一定需要或使用任何密码;反过来说:需要密码的程序(特别是loginsusudo等......)是setuid(在Linux上它们是free software所以你可以学习他们的源代码);尝试ls -l /bin/su /usr/bin/sudo /bin/login检查一下。

由于您要模拟各种用户环境,请注意environ(7)