2016-11-10 65 views
1

我有以下代碼片段。設置euid與posix_spawn

char *const parmList[] = {"sh", "-c", "whoami", NULL}; 
if(geteuid() == 0) { 
    seteuid(atoi(getenv("SUDO_UID"))); 
} 
posix_spawn(&pid, "/bin/sh", NULL, NULL, parmList, environ); 

從我的理解的posix_spawn的默認行爲是:

如果未設置POSIX_SPAWN_RESETIDS標誌,子進程將繼承父進程的有效用戶ID。

然而,當我運行我的程序與sudo,我仍然得到rootposix_spawn輸出。我如何擁有它,所以posix_spawn將以原始用戶身份運行?有一個更好的方法嗎?

+0

任何原因,你只能讓指針指向文字'const'實現這一點,但不是他們指向的風向標? – Olaf

+0

@Olaf不,我會編輯它。這並沒有改變根本問題。 – twodayslate

+1

你可以在你的命令上運行'strace -f'並檢查shell是否重置了euid?許多炮彈,如果他們看到ruid!= euid,會重置euid以匹配。 –

回答

-1

我結束了創建一個功能fork當時的exec小號

pid_t runCmd(char *cmd) { 
    if(!cmd) return -1; 

    pid_t ans = fork(); 
    if(ans == 0) { 
     if(geteuid() == 0) { 
      int uid = atoi(getenv("SUDO_UID")); 
      setreuid(uid, uid); 
     } 
     if(verbose_flag) println("uid %d; euid %d", getuid(), geteuid()); 
     char *const parmList[] = {"sh", "-c", cmd, NULL}; 
     execv("/bin/sh", parmList); 
    } 
    return ans; 
} 

whoami現在返回原來的用戶

+0

IMO,'posix_spawn()'是惡魔的衍生物 - 一個非問題的難以置信的複雜解決方案。 AFAIK,'fork()'和'exec()'範例可以解決所有'posix_spawn()'及其相關函數可以排除的問題,而且編碼更少。 –

+3

@JonathanLeffler,當分叉一個大的進程時會有開銷,因爲'fork'需要父進程的兩倍的內存量。 'posix_spawn'解決了這個問題,你可以詳細閱讀更多關於它和fork的性能問題,[here](http://www.oracle.com/technetwork/server-storage/solaris10/subprocess-136439.html) – TheDarkKnight