如何成為 Root 用戶
我們強烈建議不要以 root 身份執行圖像介面。這樣做很易會引起大禍。最妥善的做法就是登入成為沒有特殊權限的一般用戶,然後按需要應用 root 的權限。
1. 使用 su 指令
有很多指令都只可以用 root 身份去執行,因此我們需要成為 root 用戶。要這樣做,我們可以使用 su 指令(更替用戶)。su 指令有下列格式:
su - <user>
或
su <user>
但我們最經常是用 su 指令來成為 root 用戶:
su - root
或
su root
如果不指定用戶名稱,預設的用戶是 root,因此以上的指令可以縮短為:
su -
或
su
然然這兩個指令有不同的特性。'su <user>' 將 <user> 這個身份賦予現時的用戶;而 'su- <user>' 除了將 <user> 的身份賦予現時的用戶之外,更會將環境設置成 <user> 登入時的環境。
很多時候,用戶會單單採用 'su' 來成為 root,嘗試執行一個指令(例如:ifconfig),然後收到一個 'command not found' 的錯誤。舉個例子:
su Password: ifconfig bash: ifconfig: command not found
原因是系統上的普通用戶與 root 用戶有不同的 PATH 環境變數。當你輸入一個 Linux 指令,指令殼會嘗試在用戶的 PATH 內搜尋及執行那個指令。它會搜尋 PATH 變數內的每個目錄直至找到配對。
很多時候當用戶在 IRC 或其它地方匯報問題時,他們會被導向此頁。當你要偵測為何找不到某個執行檔時,檢視現有的 PATH 很有幫助:echo $PATH
為普通用戶而設的指令多數位於 /usr/bin 及 /bin,偶爾也會在 /usr/local/bin —— 上游在包裝時預設不會採用 /usr/local/* 路徑。然而,root 的指令多數位於 /usr/sbin 及 /sbin,偶爾也會在 /usr/local/sbin。這亦反映在 root 的 PATH 內。
當你用 su - 來變成 root 時,你亦會採納 root 的 PATH;反觀只用 su 就會保留用戶的 PATH 值。正因如此,單單用 su 來成為 root 時,執行 /usr/local/sbin/、/usr/sbin、或 /sbin 內的指令便會導致 command not found 這個錯誤。要穫得更詳細的解釋,請參閱 bash 的使用手冊(man bash),特別是有關 INVOCATION 及登入指令殼這個部份。
因此你假若只使用 su,便須要提供指令的完整路徑(例如:/sbin/ifconfig),否則請使用 su - 來成為 root。
2. 使用 sudo
其實你不必在每次執行某些管理的工作時都要是 root。由於有 sudo,你可以用 root 的身份去執行個別或所有指令。當 sudo 被安裝妥後(套件名稱:sudo),你可以用 root 的身份執行 visudo 來設置它。基本上,這樣會利用 $EDITOR(預設是 vim)來開啟 /etc/sudoers,但我們不建議你手動編輯它。假若你是在一台桌面電腦上,你應該會想做差不多所有事情。
因此,一個倉促的方法來設定 sudo 就是在 sudoers 檔案的底部加入:
bob ALL=(ALL) ALL
這裡 bob 是用戶的名稱。儲存(按 escape,然後輸入 ZZ),接著你便準備好了。現在以 bob 登入,然後執行下列例子:
$sudo yum update
sudo 會要求輸入密碼。這個密碼是 bob 的密碼,不是 root 的密碼,因此請小心地將 sudo 權限給予每個用戶。
不過 sudo 能夠做更多事情。我氜可以容許一個用戶或一群用戶單單執行一個指令、或者一組指令。讓我們重新返到 sudoers 檔案(順帶一提,它在 CentOS 5 下有很清楚的備註)。首先我們看看 bob 及 alice,他們是 admin 群組內的成員。如果我們想 admin 群組內的所有成員都能夠以 root 的身份執行所有指令,我們可以修改上面的範例:
%admin ALL=(ALL) ALL
bob 依然可以做他的事情,而 alice 現在亦能夠利用她的密碼,以相同的權限執行 sudo。假若 bob 及 alice 並不是在同一個群組內,我們可以在 sudoers 檔內定義一個用戶別名:
User_Alias ADMINS = alice, bob
這裡我們定義了名為 ADMINS 的別名,內裡有 alice 及 bob 為成員。
然而,我們不想 alice 及 bob 以 root 的身份執行所有指令,而只是執行 updatedb。讓我們定義一個指令別名:
Cmnd_Alias LOCATE = /usr/sbin/updatedb
這樣仍然不定夠!我們須要告訴 sudo ADMINS 內的用戶只能執行 LOCATE 內的指令。就此,我們用下列這行取代 %admin 那一行:
ADMINS ALL = LOCATE
這裡的意思就是 ADMINS 別名內的用戶可以執行 LOCATE 別名內的所有(ALL)指令。
此刻,/etc/sudoers 會是這個樣子:
User_Alias ADMINS = alice, bob Cmnd_Alias LOCATE = /usr/bin/updatedb ADMINS ALL = LOCATE
alice 及 bob 應該可以利用他們的密碼來以 root 的身份執行 updatedb。
如果我們將檔案的最後一行改為:
ADMINS ALL = NOPASSWD: LOCATE
alice 及 bob 便能夠在不輸入密碼的情況下執行 sudo updatedb。
你可以在一個指令別名內加入更多指令,以及在一個規則裡加入更多別名。舉個例說,我們可以建立一個名為 NETWORKING 的別名,當中包含一些網絡的指令,例如:ifconfig、route 或 iwconfig:
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
/usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool讓我們將這些加進我們的 /etc/sudoers 檔案內(利用 visudo!),然後授權給我們的 ADMINS 群組內的用戶。現在 /etc/sudoers 會是這個樣子:
User_Alias ADMINS = alice, bob
Cmnd_Alias LOCATE = /usr/bin/updatedb
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
/usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
ADMINS ALL = LOCATE, NETWORKING 作個小嘗試:登入為 alice(或 bob),然後輸入:
$ping -c 10 -i 0 localhost
答覆應該立刻出現:
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data. ping: cannot flood; minimal interval, allowed for user, is 200ms
現在,嘗試用 sudo 來執行它:
$sudo ping -c 10 -i 0 localhost PING localhost.localdomain (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.049 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=64 time=0.034 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=64 time=0.021 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=4 ttl=64 time=0.030 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=5 ttl=64 time=0.017 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=6 ttl=64 time=0.016 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=7 ttl=64 time=0.016 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=8 ttl=64 time=0.016 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=9 ttl=64 time=0.016 ms 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=10 ttl=64 time=0.016 ms --- localhost.localdomain ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 1ms rtt min/avg/max/mdev = 0.016/0.023/0.049/0.010 ms, ipg/ewma 0.187/0.028 ms
sudo 經常被用來將專用指令的部份存取權賦予某些用戶,好讓他們能進行有限度的管理工作。sudo 的一個好處,就是所以 sudo 的指令都會被記錄在 /var/log/secure 內。以上的例子將這行寫入日誌內:
Apr 18 11:23:17 localhost sudo: bob : TTY=pts/0 ; PWD=/home/bob ; USER=root ; COMMAND=/bin/ping -c 10 -i 0 localhost
就是這樣了。使用 sudo 時,請不要忘記:「能力越強,責任越大」。
2.1. sudo 指令殼
假若你在 suderos 內擁有足夠的權限,你亦可以這樣可打開一個 root 指令殼
sudo -s
或
sudo -i
第二個方法只適用於 CentOS 5。當採用 sudo -s 時,你將會在呼叫用戶的環境下運行 root 指令殼。請格外小心,因為你將會以 root 的身份來建立或更改檔案,但 $HOME 的值指向呼叫用戶的主目錄。
3. 圖像介面的幫手
3.1. GNOME
待寫……
3.2. KDE
KDE 選單上的「執行指令……」選項(透過「選項」)容許以另一個用戶的身份去執行一個指令或應用程式。對指命行較陌生的用戶可以考慮利用這個圖像化的方法來進行需要 root 身份的工作。
4. consolehelper
consolehelper 是一個用來執行圖像化應用程或的包裝函式。當它啟動時,它會檢查 PAM 對應所需應用程式的設定。言下之意,就是我們可以透過所有已安裝的 PAM 模塊來驗證用戶。最基本的方式是提供一個密碼,但假如我們有合適的硬件,我們亦可以利用智能咭、信物、指紋等來進行驗證。PAM 的設定已經超越這個文件的範圍(參見 PAM Administrator's Guide),因此我們只會示範如何設定透過 consolehelper 以 root 身份來執行一個應用程式,並要求 root 的密碼。
作為一個例子,讓我們設定以 root 身份執行 /usr/bin/xterm。
首先,由於我們亦想保留以普通用戶的身份來執行 xterm 的可能性,我們需要建立一個名為 /usr/bin/xterm-root 的連結,指向 /usr/sbin/consolehelper:
ln -s /usr/sbin/consolehelper /usr/bin/xterm-root
現在我們設置 pam —— 建立 /etc/pam.d/xterm-root:
#%PAM-1.0 auth include config-util account include config-util session include config-util
最後,設定當 consolehelper 以 xterm-root 啟動時,用 root 的身份去執行 /usr/bin/xterm。建立 /etc/security/console.apps/xterm-root 這個檔案:
USER=root PROGRAM=/usr/bin/xterm
這樣就成了。執行 xterm-root(透過指令行或 .desktop 檔案),輸入 root 密碼,然後好好享受。如果收到 Xlib: connection to ":0.0" refused by server 這個錯誤,請先執行 'xhost local:root'。
請亦參詳一位有見地的社區成員所著的外置文章。
Translation of revision 22
