在unix系統中,使用者有許可權、程序有許可權、檔案有許可權,有點混亂,有必要做乙個總結。
1、使用者許可權
2、檔案訪問許可權
《unix環境高階程式設計》p13中提到,對於磁碟上的每個檔案,檔案系統都存放檔案所有者的使用者id和組id。也就是說,檔案只能被擁有,每個檔案都屬於特定的使用者和特定的組。使用ls -l可以檢視檔案的所有者的使用者名稱和組名。下面是ubuntu10.04下的截圖。
上圖中desktop的使用者是root,組是liyihai。
3、程序許可權
《unix環境高階程式設計》p12中提到,如果乙個程序具有超級使用者許可權,則大多數檔案許可權檢查都不再進行。某些作業系統功能只限於向超級使用者提供,超級使用者最系統有自由的支配權。
疑問一:乙個程序的許可權由程式的檔案許可權決定還是執行這個程序的使用者許可權決定呢?
下面做乙個測試。
#include #include #include int main(void)
將上面的**編譯號,將生產的可執行檔案的使用者名稱改為liyihai,如下圖
然後使用root使用者去執行這個程式,結果如下。
由結果可見,雖然a.out的所有者為liyihai,但是root使用者執行它後,其使用者id是0,即root的使用者id。
可以得出結論:程序的許可權是由使用者許可權決定的,而不是程式檔案的許可權。 然而,根據《unix環境高階程式設計》2ndp75的說法,這也是不絕對的!
實際uid/gid在登陸時就確定,一般不改變。而有效uid/gid會根據執行的(比如開啟、讀、寫等操作,並非指二進位制可執行檔案!)檔案是否開啟了設定uid/gid而變化。如果乙個檔案沒有開啟設定uid/gid,就是上面截圖的結果,其有效uid/gid和實際uid/gid一樣;
如果乙個檔案開啟了設定uid,那麼對這個檔案進行操作的程序的有效uid就會變成這個檔案的uid!也就是說,如果乙個檔案的uid是root,乙個普通程序開啟它之後,這個程序的有效uid就變成了root!
需要注意的是,改變的是有效uid/gid,而不是實際的uid/gid,有效uid/gid用於檔案的訪問。
疑問二:程序是被擁有還是主動擁有?
在2中提到過,檔案只能被擁有,其實,程序也一樣。在《unix環境高階程式設計》p14中提到,當向乙個程序傳送訊號時,我們必須是該程序的所有者或者是超級使用者。
4、許可權的變化
在參考資料[1]p192中提到,當程式需要增加特權,或需要訪問當前並不允許訪問的資源是,需要更換自己的使用者id或者組id,使得新id具有適合的特權或訪問許可權;反過來,當程式需要降低其特權或者阻止對某些資源的訪問時,也需要更換使用者id或組id,從而使新id不具有相應特權或訪問這些資源的能力。
參考資料
[1]《unix環境高階程式設計》2nd
[2]如何更改linux檔案的擁有者及使用者組(chown和chgrp)
賬戶管理UID,GID
超級使用者 root uid,gid 0,超級使用者是系統管理員,具備系統最高許可權 程式使用者 每個程式在建立時會自動建立乙個程式使用者,uid,gid 1 999,一般這個使用者只在維護這個程式時才會被使用,一般也是不允許此使用者使用賬戶密碼登入到系統中去。普通使用者 系統賬戶,命令建立 uid...
修改Linux使用者的UID GID
對於nfs共享檔案,保留檔案許可權,需要uid gid與nfs server端一致!試驗環境 centos6.5 64 172.24.0.26 01 使用者的uid和gid不能被占用 root 26 id mvp uid 501 mvp gid 501 mvp groups 501 mvp 假定我需...
linux 檢視使用者的uid,gid
1.可以通過檢視 etc passwd檔案來確定自己的 uid和 gid cat etc passwd grep 你的使用者名稱例子 lan lan 桌面 檔案和目錄 cat etc passwd grep lan lan x 1000 1000 lan,home lan bin bash其中x後面...