linux/unix下setuid/seteuid/setreuid/setresuid
?
其中setresuid()具有最清晰的語法:
?
setresuid()被執行的條件有:
?
①當前進程的euid是root
②三個參數,每一個等于原來某個id中的一個
?
如果滿足以上條件的任意一個,setresuid()都可以正常調用,并執行,將
?
進程的ID設置成對應的ID。
?
例子:
?
如果ruid=100,euid=0,suid=300
?
則setresuid(200,300,100)可以執行,因為原來的euid=0.
?
如果ruid=100,euid=300,suid=200
?
則setresuid(200,300,100)也可以執行,因為這三個新的id都是原來id中的某一個。
?
但是setresuid(100,200,400)就不能執行,因為400不等于原來三個id中的任意一個。
?
?
?
setresuid()有個性質,英文名稱是all-or-nothing effect,意思是,如果setresuid()
?
對某一個ID設置成功了,其他的失敗了,比如只改變了ruid,suid和euid都改失敗了
?
那么程序會將ruid改回原來的值,即保證要么三個ID都能成功修改,要么三個都沒能修改成功。
?
PS:FreeBSD和Linux支持setresuid,Solaris不支持setresuid,但有自己的實現方式。
?
?
?
seteuid()也有較清晰的語法:
?
? 無論什么情況,它只改變進程euid,而不改變ruid和suid。
?
? 如果原來的euid==0,則新的euid隨意設,都可以成功改變。
?
? 如果原來的euid!=0,不同的系統的處理方式是不一樣的:
?
-Solaris和Linux只允許新的euid等于原來三個id中的任意一個;
-但是FreeBSD只允許新的euid等于ruid和suid中的一個;
貌似FreeBSD這個限制是多余的,因為新的euid==原來的euid的時候應該是可以的,但是它會報錯,不允許。
?
?
?
setreuid()有點小復雜:
?
? 它會修改ruid和euid,也某些情況下,也會修改suid。
?
? 而且不同的系統對setreuid也有不同的處理方式:
?
-在Solaris和Linux中,setreuid(geteuid(),getuid())可以實現ruid和euid的交換
-FreeBSD則會失敗;
?
?
?
setuid():
?
如果原來的euid==0,則該函數將會設置所有的id都等于新的id。
?
如果原來的三個id為:ruid=300,euid=0,suid=100
?
則setuid(200)執行以后,ruid=200,euid=200,suid=200
?
?
?
如果原來的euid!=0,但是新的id等于原來ruid和suid中的一個,那么也是可以執行的。否則就不能執行。
?
比如原來的三個id為:ruid=100,euid=200,suid=300
?
則setuid(300)可以執行,執行結束以后ruid=100,euid=300,suid=300(也就是說只改變了euid)。
?
setuid(400)就不能執行。
?
?
?
不同的系統有不同的處理方式:
?
-Linux和Solaris:如果euid不等于0,那么新的id必須等于ruid或者suid中的一個(就是我們上面說的);
-FreeBSD待定,還沒搞清楚;
?
setuid()的行為不僅取決于系統,還取決于進程的優先級:
?
-Linux和Solaris:如果euid==0,那么將三個id都設置為新的id;否則,只設置euid;
-FreeBSD:不管euid值,如果執行成功,直接設置所有的id都為新的id;
?
轉載于:https://www.cnblogs.com/bittorrent/p/3260483.html
總結
以上是生活随笔為你收集整理的linux/unix下setuid/seteuid/setreuid/setresuid的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab如何绘制函数方程,如何使用M
- 下一篇: C语言 Linux版俄罗斯方块,C语言版