Linux 中的 su 和 sudo 命令有什么區(qū)別?
??su?
?? 和 ??sudo?
?? 命令都允許用戶執(zhí)行非特權(quán)用戶不允許做的系統(tǒng)管理任務(wù),即只有 root 用戶能執(zhí)行的命令。有些人更喜歡 ??sudo?
?? 命令:例如 ??Seth Kenlon??? 最近發(fā)布的一篇 《??在 Linux 上使用 sudo 的 5 個理由???》,他在其中詳細闡述了 ??sudo?
? 命令的許多優(yōu)點。
但是,相較于 ??sudo?
? 命令,我更偏好于 ??su?
?? 命令 來做系統(tǒng)管理工作。在本文中,我比較了這兩個命令的區(qū)別,并解釋了為什么我更喜歡 ??su?
? 而不是 ??sudo?
?,但我仍然同時使用這兩個命令的原因。
過去的系統(tǒng)管理員主要使用 su 命令
??su?
? 和 ??sudo?
? 命令是為不同的世界設(shè)計的。早期的
Unix 計算機需要全職系統(tǒng)管理員,他們使用 root 用戶作為唯一的管理帳戶。在這個古老的世界里,有管理員密碼的人會在電傳打字機或 CRT
終端(例如 DEC VT100)上以 root 用戶登錄,然后執(zhí)行一些管理 Unix 計算機的工作。
管理員還會有一些非 root 帳戶,用于執(zhí)行一些非 root 的任務(wù),例如編寫文檔和管理電子郵件等。在這些 Unix 計算機上通常有許多非
root 帳戶,他們都不需要完全的 root 訪問權(quán)限,只需要以 root 權(quán)限運行很少的命令,大約 1 至 2 個就可以了。許多系統(tǒng)管理員以
root 用戶登錄,完成 root 工作,并在任務(wù)完成后,退出 root 會話。有時候,系統(tǒng)管理員需要整天以 root 用戶來登錄,因為 ??sudo?
? 命令需要鍵入更多的內(nèi)容才能運行必要的命令,因此大多數(shù)系統(tǒng)管理員很少使用 ??sudo?
? 命令。
??sudo?
? 和 ??su?
? 這兩個命令都能夠提權(quán)為 root 用戶,但它們實現(xiàn)的方式大不相同。這種差異是由于它們最初打算用于不同的情況。
sudo 命令
??sudo?
? 命令的初衷是讓 root 用戶能夠讓幾個非 root 用戶訪問他們經(jīng)常需要的一兩個特權(quán)命令。??sudo?
? 命令允許非 root 用戶暫時地獲得更高權(quán)限,來執(zhí)行一些特權(quán)命令,例如添加和刪除用戶、刪除屬于其他用戶的文件、安裝新軟件以及管理現(xiàn)代 Linux 主機所需的任何命令。
??sudo?
? 命令允許非 root 用戶訪問一兩個 需要更高權(quán)限 的常用命令,這樣可以幫助系統(tǒng)管理員節(jié)省來自用戶的許多請求,并減少等待時間。??sudo?
? 命令不會將用戶帳戶切換為 root 用戶,因為大多數(shù)非 root 用戶永遠不應(yīng)該擁有完全的 root 訪問權(quán)限。在大多數(shù)情況下,??sudo?
? 允許用戶執(zhí)行一兩個命令,然后提權(quán)就會過期。在這個通常為 5 分鐘的短暫的提權(quán)時間內(nèi),用戶可以執(zhí)行任何需要提權(quán)的管理命令。需要繼續(xù)使用提權(quán)的用戶可以運行 ??sudo -v?
? 命令來重新驗證 root 訪問權(quán)限,并將提權(quán)時間再延長 5 分鐘。
使用 ??sudo?
? 命令還有一些副作用,例如生成非 root 用戶使用命令的日志條目及其 ID。這些日志可以在之后作為出現(xiàn)問題的檢驗,來給用戶更多的操作培訓(xùn)。(你以為我會說“問責(zé)”用戶,對吧?)
su 命令
??su?
? 命令能夠?qū)⒎?root 用戶提權(quán)到 root 權(quán)限 —— 事實上,能讓非 root 用戶成為 root 用戶。唯一的要求是用戶知道 root 密碼。因為用戶已經(jīng)以 root 權(quán)限登錄,所以之后的操作就沒有限制了。
??su?
? 命令所提供的提權(quán)沒有時間限制。用戶可以作為 root 執(zhí)行命令,不需要進行重新驗證是否有 root 權(quán)限。完成任務(wù)后,用戶可以執(zhí)行退出命令 ??exit?
?,從 root 用戶恢復(fù)到自己原來的非 root 帳戶。
su 和 sudo 在使用上的爭議和變化
最近在 ??su?
? 與 ??sudo?
? 的使用上存在一些分歧。
真正的系統(tǒng)管理員不會使用 ?
?sudo?
??!?Paul Venezia
Venezia 在他的 ??InfoWorld 文章?? 中辯稱,對于許多擔(dān)任系統(tǒng)管理員的人來說,??sudo?
? 是一個不必要的工具。他沒有花太多時間為這個觀點進行解釋,他只是把它說成了一個事實。我同意他對于系統(tǒng)管理員的觀點,因為我們不需要 ??sudo?
? 來完成我們的工作。事實上,??sudo?
? 使得事情變得更復(fù)雜了。
然而,
時代在“改變”?!?Bob Dylan
Bob Dylan 是對的,盡管他唱的歌不是指計算機(LCTT 譯注:Bob Dylan 是美國創(chuàng)作歌手、藝術(shù)家和作家,這里指他不是針對于電腦而說的)。
自從人手一臺的個人計算機時代到來,計算機的管理方式發(fā)生了重大變化。在許多環(huán)境中,計算機的使用者也是它的管理員,這使得為這些用戶提供一些對 root 權(quán)限的訪問是有必要的。
一些現(xiàn)代發(fā)行版,例如 Ubuntu 及其衍生版本,只能使用 ??sudo?
? 命令來執(zhí)行特權(quán)命令。在這些發(fā)行版中,用戶無法直接以 root 用戶身份登錄,甚至無法通過 ??su?
? 切換到 root,因此需要 ??sudo?
? 命令來允許非 root 用戶獲得 root 權(quán)限。在這一環(huán)境中,所有系統(tǒng)管理任務(wù)均使用 ??sudo?
? 來執(zhí)行。
通過鎖定 root 帳戶并將常規(guī)用戶帳戶添加到“輪子”組(??wheel?
?),可以實現(xiàn)此配置,但是這種配置很容易被繞過。接下來,讓我們在
Ubuntu 主機或虛擬機上嘗試一些小實驗吧。我在這里說明一些我的設(shè)置,以便你可以根據(jù)需要來重現(xiàn)它。我安裝的是 Ubuntu 16.04
LTS1,并使用 VirtualBox 將其安裝在虛擬機中。在安裝過程中,我創(chuàng)建了一個非 root 用戶 ??student?
?,為了簡便起見我給這個用戶設(shè)置了一個簡單的密碼。
以 ??student?
? 用戶身份登錄 Ubuntu,并打開終端。查看 ??/etc/shadow?
? 文件中的 root 條目,其中存儲了經(jīng)哈希的密碼。
可以看到終端拒絕了我們對 ??/etc/shadow?
? 的訪問,因此我們無法查看 ??/etc/shadow?
? 文件。所有發(fā)行版都是如此,以防止非特權(quán)用戶看到和訪問加密的密碼,因為非特權(quán)用戶可能會使用常見的黑客工具來破解這些密碼。
現(xiàn)在,讓我們使用 ??su -?
? 命令來成為 root 用戶。
認證失敗的原因是因為 root 帳戶沒有密碼、并且被鎖定了。接下來,使用 ??sudo?
?? 命令查看 ??/etc/shadow?
? 文件。
在這里,我僅截取了部分結(jié)果,只顯示 root 和 ??student?
? 用戶的條目。我還縮短了加密密碼,以便該條目能顯示在一行中。各個字段以冒號(??:?
?)分隔,第二個字段是密碼。請注意,root 的密碼字段是一個感嘆號(??!?
?),這表明 root 帳戶已被鎖定,且無法使用。
現(xiàn)在,要將 root 帳戶變成一個合適的系統(tǒng)管理員,你只需為 root 帳戶設(shè)置密碼。
現(xiàn)在,你可以直接以 root 身份登錄到控制臺,或者直接使用 ??su?
? 登錄到 root,而不是在每個命令前都加一個 ??sudo?
?。當(dāng)然,你也可以在每次想以 root 身份登錄時,使用 ??sudo su -?
?,但這又是何必呢?
請不要誤解我的意思。像 Ubuntu 這樣的發(fā)行版及其上下游衍生版非常好,多年來我已經(jīng)使用了其中的幾個。在使用 Ubuntu 和相關(guān)發(fā)行版時,我做的第一件事就是設(shè)置一個 root 密碼,這樣我就可以直接以 root 身份登錄。其他發(fā)行版,如 Fedora 及其相關(guān)發(fā)行版,現(xiàn)在在安裝過程中提供了一些有趣的選擇。我注意到的第一個 Fedora 版本是 Fedora 34,我在寫我的一本即將出版的書時安裝了很多次。
在安裝頁面上,可以找到其中一個安裝選項,來設(shè)置 root 密碼。這個新選項允許用戶選擇“鎖定 root 帳戶Lock root account”,就像 Ubuntu 鎖定 root 帳戶的方式一樣。此頁面上還有一個選項,允許使用密碼以 root 身份遠程 SSH 登錄到此主機,但這僅在 root 帳戶解鎖時有效。第二個選項位于允許創(chuàng)建非 root 帳戶的頁面上。此頁面上的選項之一是“讓此用戶成為管理員Make this user administrator”。選中此選項后,用戶 ID 將添加到一個名為 ??wheel?
? 組的特殊組中,該組授權(quán)該組的成員使用 ??sudo?
? 命令。Fedora 36 甚至在該復(fù)選框的描述中提到了 ??wheel?
? 組。
可以將多個非 root 用戶設(shè)置為管理員。使用此方法指定為管理員的任何人都可以使用 ??sudo?
? 命令在 Linux 計算機上執(zhí)行所有管理任務(wù)。Linux 在安裝時只允許創(chuàng)建一個非 root 用戶,所以其他新用戶可以在創(chuàng)建時添加到 ??wheel?
? 組中。root 用戶或其他管理員可以使用文本編輯器或 ??usermod?
? 命令直接將現(xiàn)有用戶添加到 ??wheel?
? 組。
在大多數(shù)情況下,今天的管理員只需要執(zhí)行一些基本任務(wù),例如添加新的打印機、安裝更新或新軟件,或者刪除不再需要的軟件。這些 GUI 工具需要 root 或管理密碼,并將接受來自管理員用戶的密碼。
在 Linux 上,我是怎么使用 su 和 sudo 的呢
我同時使用 ??su?
?? 和 ??sudo?
?。它們都是我所使用的很重要的系統(tǒng)管理員工具。
我不鎖定 root 帳戶,因為我需要用 root 帳戶來運行我的 ??Ansible?? 腳本和我編寫的 ??rsbu?? Bash 程序,來執(zhí)行備份。這兩個程序都需要以 root 身份運行,我編寫的其他幾個管理 Bash 的腳本也是如此。我使用 ??su?
?? 命令切換到 root 用戶,這樣我就可以執(zhí)行這些腳本和許多其他常見的命令。當(dāng)我需要確定問題和解決問題時,使用 ??su?
? 命令將我的權(quán)限提升到 root 十分有用,因為我不希望 ??sudo?
? 帶來的提權(quán)會話超時。
當(dāng)非 root 用戶需要執(zhí)行這些任務(wù)時,我使用 ??sudo?
?? 命令,來執(zhí)行需要 root 權(quán)限的任務(wù)。我在 ??sudoers?
? 文件中設(shè)置了非 root 帳戶,只允許訪問完成任務(wù)所需的一兩個命令。當(dāng)我只需要運行一兩個需要提權(quán)的快速命令時,我自己也會使用 ??sudo?
? 命令。
結(jié)論
實際上只要你把工作完成好了,你使用什么工具都無大礙。你使用的是 Vim 還是 Emacs,是 systemd 還是 SystemV,是 RPM 亦或是 DEB,是 ??sudo?
? 亦或是 ??su?
?,在結(jié)果上會有什么區(qū)別呢?這里的關(guān)鍵在于你應(yīng)該使用最適合你的工具。Linux 和開源軟件的最大優(yōu)勢之一是通常有許多選項可用于我們需要完成的任務(wù)。
??su?
? 和 ??sudo?
? 都各有長處,如果正確使用的話,兩者都是非常安全的。我選擇同時使用 ??su?
? 和 ??sudo?
? 命令,基于它們的歷史功能,因為這對我來說十分有用。對于我自己的大部分工作,我更喜歡 ??su?
? 命令,因為它與我的工作流程最適配。
本文摘自于我的書《系統(tǒng)管理員的 Linux 哲學(xué)The Linux Philosophy for Sysadmins(Apress,2018 年)》一書的第 19 章,并經(jīng)許可后重新發(fā)布。