Linux
bash 可以使用 uid 0 和不同的 euid 執行嗎?
我正在編寫一些
bash
程式碼,我想檢查腳本是否具有 root 權限。我從其他人那裡看到的所有程式碼都只檢查$EUID == 0
. 完全有可能讓其他程序以 UID = 0 和 EUID > 0 執行。我的程式碼不應該同時檢查兩者嗎?或者 bash 有什麼東西可以防止這種(奇怪的)情況發生嗎?對於那些想看到這種情況的人,這裡有一個概念證明:
[root@new-host bennett]# cp /bin/sleep . [root@new-host bennett]# chown bennett sleep [root@new-host bennett]# chmod 4755 sleep [root@new-host bennett]# ll sleep -rwsr-xr-x. 1 bennett root 32188 Sep 9 02:38 sleep [root@new-host bennett]# ./sleep 1000 & [root@new-host bennett]# ps -e -o user= -o ruser= -o comm= | awk '$1 != $2' bennett root sleep
概括一下這個問題:在任何情況下都可能
bash
遇到(( $UID == 0 && $EUID > 0 ))
什麼情況?其他程序可以。
是的:
$ env UID=0 EUID=90 bash -c 'echo $UID $EUID' 0 90
請注意,上面只是改變了變數的值。實際的UID 和 EUID 不受影響。
你應該
id
改用。參見問題How to stop a script from running if it’s not root (and echo “Not running as root! Exiting…”)如果腳本設置了 set-uid 位,則有效使用者 ID 也將與真實 ID 不同(並且在您的 Unix 上執行此類腳本 set-uid 是一件事情)。在這種情況下,UID 將是呼叫腳本的使用者的 UID,而 EUID 將是腳本所有者的 UID。