[英]Linux C programming execute as user
我有一個以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
,則可以在父進程中以root euid
時更改子進程的euid
。 代碼看起來像這樣:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int runAs(int gid, int uid, char **env, char *command) {
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);
} 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;
}
如果您想以普通用戶身份執行一項操作而以root用戶身份執行另一項操作,那么您始終可以在子進程中fork和setuid,以便在保留程序的其他部分時不具有root權限。
從setuid手冊: [if caller was root] it is impossible for the program to regain root privileges
。
你想做什么? 您可以將SUID位設置為您的程序並以用戶身份運行 - 然后您可以使用seteuid臨時刪除root權限並成為調用用戶,然后再次重置權限。 如果你真的必須以root身份運行它 - 我的猜測是你應該fork(),將一個進程保留為root,另一個進程為setuid()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.