簡體   English   中英

Linux C編程以用戶身份執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM