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

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

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

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

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

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

所以,问题是

  • 如何在执行期间切换用户?
  • 反正我是否可以在1个可执行文件中实现它?
  • 使用POSIX API执行此操作会更好。
  • 使用普通用户运行我的应用程序,为我的应用程序提供root密码,使用root密码切换到root。

阅读有关setuid可执行文件和setreuid(2)以及execve(2)系统调用的更多信息。 注意,在更改其所有权(使用chown(1) )并仔细编码以避免安全漏洞后,您需要使用chmod u+s (请参阅chmod(1) )将setuid标志放在可执行文件上。

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

Setuid是获取(或撤销)权限的基本机制(由susudosuperlogin等…使用)。 请参阅凭据(7)和function(7) 。

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

在编码之前,我建议您阅读一本好的书,如高级Linux编程和系统调用(2)以及您将使用的每个系统调用的文档。 安全方面尤为重要。

Setuid可执行文件不一定需要或使用任何密码; 反过来说:需要密码的程序(特别是loginsusudo等……)是setuid(它们是Linux上的免费软件 ,所以你可以研究它们的源代码); 尝试使用ls -l /bin/su /usr/bin/sudo /bin/login来检查。

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