[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

如何切換為 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,但我們建議不要作手動編輯。要是你擁有一台桌面電腦,你應該會想容讓自己執行大部份的指令。

有見及此,最便捷的方法就在在 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 別名內的所有指令。

到現時為止,/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

讓我們(利用 visudo)將這別名加進 /etc/sudoers 檔,並授權給 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 指令殼

要是你在 sudoers 擁有足夠權限,你可以這樣進入 root 的指令殼:

sudo -i

3. 圖像界面協助程式

3.1. GNOME

待辦……

3.2. KDE

KDE 選單內的 Run Command... 項目提供選項,透過提供另一個用戶的密碼,以該用戶的身份來執行指令或應用程式。對指令行缺乏信心的用戶可考慮以此圖像界面來進行須要 root 權限的工作。

4. consolehelper

consolehelper 是用來執行圖像界面應用程式的封套。當它啟動時,它會檢查 PAM 對目標程式的相關設定。意思就是我們可以利用已安裝的 PAM 模塊驗證用戶。基本的方式是查詢密碼,但只要我們有合適的硬件,我們也可以用智能卡、符記、手指模等進行驗證。PAM 的設置已超出了本文檔的範疇(見 PAM 管理員指南),我們只會示範如何設置 PAM,讓我們以 root 身份執行應用程式時會查詢 root 的密碼。

這個範例將會設置 /usr/bin/xterm 以 root 的身份啟動。

首先,由於我們仍然有意保留以普通用戶的身份執行 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,或在 /etc/security/console.apps/xterm-root 檔內加入:

SESSION=true

請確保該行的末端有換行字元。

Translation of revision 27


2023-09-11 07:23