linux進程的幾個用戶id及其轉換

linux爲每個進程設置了3個ID:實際用戶id,有效和用戶id和保存的設置id
 
關於這3個id,需要注意以下幾個方面:
1.只有root才能改變進程的實際用戶id。例如,用戶從終端login程序登陸,此時login程序的3個id都是root。然後正確輸入用戶名密碼之後,login程序於是setuid到註冊的id。於是3個id都被改成了註冊的用戶id。然後exec shell程序。非root用戶註冊進入shell之後,他的實際用戶id是絕對不會被更改的。除非logout之後,重新註冊shell。一些su改變用戶的操作實際上都是改變shell進程的有效用戶id,並不是shell進程的實際用戶id。
2.exec程序時,可執行文件有一個設置id位,該位的設置與否與進程的有效用戶id和保存的設置id有很大關係。可以用ll命令查看,如果有s標記的話說明設置了,否則沒有。首先沒有設置的情況,3個id均不會改變和調用者的進程的id一樣。如果是設置了的情況,實際用戶id仍然不會改變,有效用戶id則設置爲可執行文件的屬主用戶,保存的設置id設置成有效用戶id一樣。這樣的程序有很多,比如passwd,su等。例如,passwd程序,一個普通用戶foo通過shell執行passwd,首先shell進程fork產生一個子進程,然後子進程exec passwd程序。由於passwd設置了設置id位,並且passwd是屬於root用戶。於是子進程設置有效用戶id位爲root,保存的設置用戶id也設置成了root。passwd執行完畢時,再改變有效用戶id和保存的設置用戶id爲以前的實際用戶id的值。
3.保存的設置ID 是由exec從有效用戶I D複製的。在exec按文件用戶I D設置了有效用戶I D後,即進行這種複製,並將此副本保存起來。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章