Linux C编程以用户身份执行
·
问题:Linux C编程以用户身份执行
我有一个以 root 身份运行的程序。我希望程序以普通用户身份执行另一个应用程序。我尝试了setgid()
并且它可以工作,但是我不能再回到 root 或其他用户。程序暂时很简单;
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[] )
{
if ( argc != 2) {
printf("usage: %s command\n",argv[0]);
exit(1);
}
setgid(100);
setuid(1000);
putenv("HOME=/home/caroline");
putenv("DISPLAY=:0");
system(argv[1]);
seteuid(1001);
putenv("HOME=/home/john");
putenv("DISPLAY=:1");
system(argv[1]);
return 0;
}
我怎样才能做到这一点?就像命令su $user-c $command
的动作
解答
如果您使用fork+exec
,您可以更改子进程的euid
,同时以 root 身份留在父进程中。代码可能如下所示:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int runAs(int gid, int uid, char **env, char *command) {
int status;
int child = fork();
if (child == 0) {
setgid(100);
setuid(1000);
do {
putenv(*env);
env++;
} while (env != null);
exec(command);
} else if (child > 0) {
waitpid(child,&status,WUNTRACED | WCONTINUED);
} else {
// Error: fork() failed!
}
}
int main(int argc, char *argv[] )
{
char *env[3];
if ( argc != 2) {
printf("usage: %s command\n",argv[0]);
exit(1);
}
env[0] = "HOME=/home/caroline";
env[1] = "DISPLAY=:0";
env[2] = NULL;
runAs(100, 1000, env, argv[1]);
env[0] = "HOME=/home/john";
env[1] = "DISPLAY=:1";
runAs(100, 1001, env, argv[1]);
return 0;
}
更多推荐
所有评论(0)