2016-03-08 63 views
0

我有以下簡單的代碼來檢查我的getuid功能:爲什麼我的setuid功能無法正常工作?

  uidActual=getuid(); 

      printf ("User id is [%d]\n", uidActual);        

      error=setuid(197623); 
      printf("[%d]",error); 

      uidActual=getuid(); 
      printf ("\n User id is [%d]\n", uidActual); 

但它總是返回-1的錯誤,所以UID不會改變。

中的setuid的197623似乎是正確的,因爲我已經,除了其他的事情,在我的mkpasswd命令了以下內容:

USER1:197609:197609 [...]

用戶2:197623:197121 [...]

其中,197609和197623必須是用戶的id,因爲事實上,我以用戶1啓動應用程序,並且我在開始和結束時正確顯示其ID:「用戶標識爲197609」 。

我已經在創建的可執行文件上爲每個人設置了所有權限,我甚至用cygwin - cygstart --action = runas ./a.exe運行可執行文件作爲根目錄,但它仍然無法運行。

有趣的是,即使沒有特殊權限或運行,setgid(用於更改組)功能與setgid(197121)完美協同工作。所以我不知道爲什麼這個函數總是返回一個錯誤。

對我的代碼有什麼問題可能會導致問題的任何想法?

感謝您的關注。

+0

那麼錯誤是什麼? -1的返回值告訴你有*錯誤;錯誤存儲在'errno'中,你可以用'strerror(errno)'得到一個描述。 – immibis

+0

不知道errno,它說操作不允許。 – user2638180

回答

0

發佈的代碼必須由具有適當權限的用戶運行。也許是:

sudo ./a.exe 

這裏是從(Linux)的手冊頁的setuid()

「EPERM摘錄的用戶不是特權(Linux的:不具備CAP_SETUID能力)和uid不匹配調用進程的真實UID或保存的設置用戶ID。「

相關問題