在Linux中,每個檔案都有其所屬的使用者和使用者組,預設情況下是檔案的建立者,也可以根據chown和chgrp來修改檔案所屬的使用者和使用者組。檔案的屬性存放在屬性結構stat中,其中有st_uid和st_gid標誌著。
先舉個例子。假設現在系統中有兩個使用者liz和hlf,有一個程式檔案file的所屬使用者為hlf。然後使用liz使用者登入系統,運行file檔案,則運行進程process有一個實際使用者和有效使用者,實際使用者預設為當前登入使用者,即liz。而有效使用者呢。有效使用者是哪個得看file檔案的屬性了,屬性結構stat裡有個st_mode檔案模式字,其中有一個設定-使用者-ID位,如果沒有設定這個位的話,那任何執行file檔案的進程的有效使用者就是其實際使用者;如果設定了這個位的話,則執行file檔案的進程的有效使用者就是該file檔案所屬使用者了。這裡,如果設定了該位,則有效使用者就為hlf,否則就為實際使用者liz了。
這裡需要說明實際使用者ID和有效使用者ID的作用。實際使用者是用來標識進程是誰,是誰在執行進程,一般是登入使用者;而有效使用者ID則標識這該進程的存取權限,假設進程的實際使用者為liz,而有效使用者為hlf,則進程可以可以訪問hlf使用者可以訪問的檔案,即擁有與hlf一樣的許可權(注意不是能夠訪問hlf的檔案)。
下面以一個程式來說明一下這整個過程。
首先,我們用root使用者產生一個可執行檔test。
然後將test檔案的所有者改成hlf使用者。
然後使用liz使用者登入到系統,執行test檔案,則根據理論,沒有設定設定-使用者-ID位,則進程的實際使用者ID和有效使用者ID都為liz。我們先查看一下使用者的ID是多少,系統使用者ID號存放在/etc/passwd檔案中。
然後在liz登入之後運行test檔案的結果如下:
可以看出實際使用者和有效使用者均為1000,即liz。現在我們修改一下test檔案的設定-使用者-ID位。
然後再在liz中運行test檔案的結果如下:
可以看出,有效使用者ID變為1001了,即為hlf了。