某處沿着線,一些工藝或其他將要需要的0(根)的有效UID,因爲只有這樣的過程可以有效UID設定爲任意的其它UID。
在shell中,su
命令是SUID根程序;它是適當的特權(POSIX行話),並可以設置真實有效的UID。同樣,sudo
命令可以執行相同的工作。通過sudo
,您還可以配置允許哪些命令和UID。關鍵區別在於su
需要目標用戶的密碼才能讓你進入; sudo
需要用戶運行它的密碼。
當然,是否有用戶應該知道其他用戶的密碼的問題。一般來說,沒有用戶應該知道任何其他用戶的密碼。
腳本UID更改很難。你可以這樣做:
su altuser -c "commands to execute as altuser"
sudo -u altuser commands to execute as altuser
然而,su
將從控制終端要求一個密碼(如果沒有控制終端會失敗)。如果您使用sudo
,它將緩存憑據(或者可以配置爲這樣做),因此您只會被要求輸入一次密碼 - 但會像su
一樣提示第一次。
解決提示很難。您可以使用與expect
平行的工具來處理僞ttys。然而,你將面臨以腳本存儲密碼(不是一個好主意)或以某種方式將它們隱藏在視線之外。
我用於工作的工具是我寫的一個工具,叫asroot
。它允許我精確控制子進程應該具有的UID和GID屬性。但它的設計只允許我使用它 - 也就是說,在編譯時,指定了授權用戶名(當然,可以更改)。不過,我可以做這樣的事情:
asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...
這臺真實有效的UID爲「某人」,設置初級團「theirgrp」,刪除所有若干輔助組,並增加了「othergrp」(這樣的過程只屬於兩個組),並將umask設置爲0222;然後它會根據給定的參數執行'somecmd'。
對於需要有限(或不受限制)訪問其他用戶帳戶的特定用戶,此功能運行良好。作爲一個通用的解決方案,它不是那麼熱門; sudo
在大多數方面都更好,但仍需要密碼(其中asroot
沒有)。
David Cournapeau和Michiel Buddingh'都有很好的觀點。我將使用os.seteuid()函數與特權用戶(不是root)結合執行腳本。 – Caedis 2009-06-11 16:28:00