一個(gè)進(jìn)程的 real user ID 是指運(yùn)行此進(jìn)程的用戶角色的 ID。
一個(gè)進(jìn)程的 effective user ID 是指此進(jìn)程目前實(shí)際有效的用戶 ID(也就是權(quán)限的大小),effective user ID 主要用來(lái)校驗(yàn)權(quán)限時(shí)使用,比如打開(kāi)文件、創(chuàng)建文件、修改文件、kill 別的進(jìn)程,等等。
如果一個(gè)進(jìn)程是以 root 身份來(lái)運(yùn)行的,那么上面這兩個(gè) ID 可以用 setuid/seteuid 隨便修改,想怎么改就怎么改,改來(lái)改去都可以。
但是如果一個(gè)進(jìn)程是以普通用戶身份來(lái)運(yùn)行的,那么上面這兩個(gè) ID 一般來(lái)說(shuō)是相同的,并且也不能隨便修改。只有一種情況例外:此進(jìn)程的可執(zhí)行文件的權(quán)限標(biāo)記中,設(shè)置了“設(shè)置用戶 ID”位!
在命令行中,設(shè)置一個(gè)可執(zhí)行文件的“設(shè)置用戶 ID”位的最簡(jiǎn)單的方法,就是用
- chmod +s /path/to/file
這個(gè)命令。
一旦用了這個(gè)命令之后,再執(zhí)行這個(gè)文件,
那么生成的進(jìn)程的 effective user ID 就變成了這個(gè)可執(zhí)行文件的 owner user ID(屬主用戶 ID),
而 real user ID 仍然是啟動(dòng)這個(gè)程序時(shí)所用的用戶的 ID。
打個(gè)比方來(lái)說(shuō),如果有這樣的一個(gè)文件:
-rw s r- s r-x 1 susesuse susesuse 7902 2006-08-31 13:22 tuid
注意這個(gè)文件已經(jīng)用 chmod +s 命令設(shè)置過(guò)“設(shè)置用戶 ID”位了。
然后我用 flw 這個(gè)用戶來(lái)執(zhí)行它,那么生成的進(jìn)程它的 real user ID 就是 flw(因?yàn)槲沂怯?flw 運(yùn)行的),但是 effective user ID 就變成了 susesuse(因?yàn)檫@個(gè)可執(zhí)行文件被設(shè)置了“設(shè)置用戶 ID”位,并且它的 owner user ID 是 susesuse)。
這時(shí),這個(gè)進(jìn)程實(shí)際上就有兩個(gè)用戶權(quán)限了。只不過(guò)目前生效的是 susesuse,因此它目前能夠且只能夠操作 susesuse 用戶的文件,如果現(xiàn)在我又想要操作 flw 用戶的文件怎么辦?
很簡(jiǎn)單,只需要 seteuid( getuid() ) 就可以了。執(zhí)行完這句之后,effective user ID 就變成和 real user ID 一樣了,都變成 flw 了。
可是如果過(guò)了一會(huì)兒我又想要變回來(lái)怎么辦?因?yàn)?effective user ID 和 real user ID 此時(shí)都變成了 flw 了,所以操作系統(tǒng)必須得有一個(gè)地方保存住原來(lái)的“設(shè)置用戶 ID”(也就是可執(zhí)行文件的 owner user ID),不然等你再想要 seteuid 的時(shí)候,操作系統(tǒng)就不知道你有沒(méi)有那個(gè)權(quán)利了。(總不能再去訪問(wèn)一次文件系統(tǒng)吧?那樣也太沒(méi)有效率了)
操作系統(tǒng)為了能夠在設(shè)置了 seteuid 之后,再次設(shè)置回來(lái),所以特地將原來(lái)的“設(shè)置用戶 ID”保存下來(lái)了,這個(gè)保存下來(lái)的設(shè)置用戶 ID 自然就叫做“保存的設(shè)置用戶 ID”
注:
setuid函數(shù)設(shè)置實(shí)際用戶ID和有效用戶ID。Linux的setuid函數(shù)和Unix中的setuid函數(shù)的行為是不同的。在Linux中, setuid(uid)函數(shù)的執(zhí)行步驟為:(1)如果由普通用戶調(diào)用,將當(dāng)前進(jìn)程的有效ID設(shè)置為uid. (2)如果由有效用戶ID符為0的進(jìn)程調(diào)用,則將真實(shí),有效和已保存用戶ID都設(shè)置為uid.
在Unix中.setuid(uid)函數(shù)的行為為: (1)如果進(jìn)程沒(méi)有超級(jí)用戶特權(quán),且uid等于實(shí)際用戶ID或已保存用戶ID,則將有效的用戶ID設(shè)置為uid.否則返回錯(cuò)誤.(2)如果進(jìn)程是有超級(jí)用戶特權(quán),則將真實(shí)、有效和已保存用戶表示符都設(shè)置為uid.如果兩個(gè)條件都不滿足,則設(shè)置errno為EPERM。
函數(shù)在執(zhí)行成功的時(shí)候返回0,在出錯(cuò)的時(shí)候返回-1.
?
參考: http://blog.csdn.net/felix_vip/article/details/7565703
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
