su 和 sudo 在 Linux 系統中,扮演管理權限一個很重要的功能,它們可以讓你在 Linux 系統上執行系統管理者命令以及管理權限。我們將深入瞭解這兩個指令的工作原理,以及如何在實際應用中使用它們。
su
指令是什麼?
su
指令是Linux中的一個關鍵工具,用於切換到其他用戶的帳戶。它的全名是 “Switch User”,意思是切換用戶。通常情況下,我們使用su
來切換到超級用戶(root)帳戶,以執行需要特權的操作。請注意,使用su
時需要知道目標用戶的密碼。
su 指令介紹
su 如何使用?
使用su
指令非常簡單。只需在終端中輸入以下命令:
#這條命令中的 "-" 表示切換到目標用戶的環境,包括目標用戶的工作目錄和 shell 環境設定。
su -
#如果您不加 "-",則僅切換用戶,但保持當前用戶的環境。
su
接下來,系統將要求您輸入目標用戶的密碼。請輸入正確的密碼,然後按下 Enter 鍵。如果您輸入的密碼正確,您將成功切換到目標用戶的帳戶。
請注意,當您使用su
切換到超級用戶帳戶時,請小心操作,因為您將擁有對系統的完全控制權。不小心的操作可能導致系統損壞,所以請謹慎使用su
指令。
su 常用參數
參數 | 描述 |
---|---|
- | 切換到目標用戶的環境,包括工作目錄和 shell 環境設定 |
-c 命令 | 執行完指定的指令之後就會自動離開 |
--help | 顯示幫助信息 |
sudo 指令介紹
sudo 是什麼?
sudo
是 “以超級用戶權限執行(Superuser Do)” 的縮寫。它允許普通用戶執行特權操作,前提是他們具有權限。相比於 su
,提供了更細粒度的權限控制,並且不需要知道超級用戶的密碼,只需要輸入您自己的密碼,用起來更方便!
sudo 如何使用?
sudo 命令
然後,系統將要求您輸入您自己的密碼,以確認您具有執行該命令的權限。如果您有權限,命令將被執行。
如:在安裝套件的時候非常常用到這個指令
sudo apt-get install 軟件包名稱
sudo 常用參數
參數 | 描述 |
---|---|
-u 用户名 | 指定要執行命令的目標用戶 |
-l 或 --list | 顯示當前用戶的 sudo 權限 |
su, sudo 簡單來說有甚麼不一樣?
整理了主要的差異如這個表格,幫助您更好了解整篇文章架構及這兩個指令的差異
指令 | su | sudo |
---|---|---|
用途 | 切換到其他用戶的帳戶,通常是超級用戶 | 以超級用戶權限執行特權命令 |
密碼 | 需要目標用戶的密碼,如 root | 需要用戶自己的密碼 |
權限控制 | 較少細粒度,通常切換到目標用戶的全部權限 | 較高細粒度,可以指定哪些命令需要特權執行 |
安全性 | 較低,因為完全切換到目標用戶,潛在風險較高 | 較高,因為只執行特權命令,限制了風險 |
用法 | su - (切換到超級用戶) | sudo 命令 (以特權執行命令) |
退出 | 使用 exit 或 logout 退出切換的用戶 | 簡單地關閉終端或使用 exit 退出特權模式 |
登錄紀錄記錄 | 登錄紀錄中顯示切換到目標用戶的記錄 | 登錄紀錄中顯示使用 sudo 執行的命令記錄 |
如何限制 sudo 指令權限 ? /etc/sudoers 文件詳細說明
/etc/sudoers
文件是 Linux 系統中非常重要的配置文件之一,它控制著使用者對 sudo
命令的訪問權限。這個文件使用特定的語法和格式來定義哪些使用者可以執行哪些命令以及在什麼條件下。
使用 visudo 命令
編輯 /etc/sudoers
文件時,應始終使用 visudo
命令,而不是直接使用文本編輯器。visudo
會檢查文件的語法錯誤,並在發現錯誤時禁止保存文件,以防止出現訪問問題。
超級使用者(root)
在 /etc/sudoers
文件中,超級使用者,也就是 root 用戶,通常被設置為預設擁有所有權限。這表示 root 用戶可以執行任何命令,而不受限於 sudo
。
使用者、群組設定
對於一般使用者,/etc/sudoers
文件允許系統管理員配置哪些使用者可以使用 sudo
命令以及其訪問權限。以下是一個示例的使用者設定:
#帳號名稱 來源主機=(可切換帳號) 可執行的指令
username ALL=(ALL:ALL) ALL
#例如,若要讓 edward 這個帳號可以使用 sudo 執行所有的指令
edward ALL=(ALL) ALL
#%群組名稱 來源主機=(可切換帳號) 可執行的指令
%groupname ALL=(ALL) ALL
#例如,要讓 dev 群組中的所有使用者都可以使用 sudo
%dev ALL=(ALL) ALL
這個設定表示 username
用戶可以以任何用戶(ALL)的身份,在任何主機(ALL)上執行任何命令(ALL)。
其中四個欄位的意義如下:
帳號名稱
:可以使用sudo
的帳號名稱。來源主機
:透過限制使用者只能從特定的網路主機連線才能使用,可以有效防止入侵者從不明的主機進行登入攻擊。如果將限制指定為 ALL,則代表不限制來源主機。可切換帳號
:如果將權限指定為 ALL,則可以取得任何帳號的權限。反之,則只能取得指定的帳號權限。可執行的指令
:如果將指令權限指定為 ALL,則可以執行任何命令。反之,則只能執行特定的命令。
命令設定
使用者設定中的最後一個 ALL
代表允許執行的命令列表。這裡可以指定具體的命令或命令的通配符。例如,如果你只想讓使用者執行特定命令,可以像這樣設置:
#帳號名稱 來源主機=(可切換帳號) 可執行的指令
john ALL=(ALL) NOPASSWD: /usr/bin/apt-get update
這表示 username
用戶可以執行 /usr/bin/apt-get update
命令,但不能執行其他命令。
通配符
假設您希望使用者 bob
能夠執行 /usr/bin/apt-get
命令以更新軟件包列表和安裝軟件包,但只對以 install
開頭的指令允許執行,而不需要輸入密碼。您可以這樣設定:
bob ALL=(ALL) NOPASSWD: /usr/bin/apt-get update, /usr/bin/apt-get install *
這個設定表示:
bob
使用sudo
時不需要輸入密碼。- 只允許
bob
執行/usr/bin/apt-get update
和/usr/bin/apt-get install
開頭的指令,並且通配符*
允許匹配任何以install
開頭的指令,無需進一步指定。
這樣,bob
就可以更新軟件包列表和安裝軟件包,而不需要輸入密碼,並且只能執行特定模式的安裝指令。請注意,使用通配符號應謹慎,以確保您的設定不會對系統造成安全風險。
主機設定
/etc/sudoers
文件也允許指定命令可以在哪些主機上執行。如果你有多台主機,可以使用主機名或通配符進行設定。例如:
#帳號名稱 來源主機=(可切換帳號) 可執行的指令
username webserver=(ALL:ALL) /usr/bin/restart-web-app
這個設定表示:
john
使用sudo
時不需要輸入密碼。- 只允許
john
執行/usr/bin/apt-get update
這個特定命令,無法執行其他命令。
這樣,john
就能夠更新軟件包列表,而不需要輸入密碼,這是一個簡單且具體的命令設定範例。
不用輸入密碼
如果想要讓特定的使用者可以在不需要輸入密碼的情況下,可以加入 NOPASSWD
的設定。例如:
#edward使用者不需要再輸入密碼
edward ALL=(ALL) NOPASSWD:ALL
#dev群組不需要再輸入密碼
%dev ALL=(ALL) NOPASSWD:ALL
使用別名
當在 /etc/sudoers
中處理複雜的配置時,例如多個使用者和指令組合,使用別名的方式來管理設定會很有用。這樣可以簡化配置並使其更易於維護。
假設您有三位系統管理員,分別是 admin1
、admin2
和 admin3
,並且您想要允許他們執行特定的管理命令。您可以使用別名來簡化這些設定。
首先,建立一個帳號別名 ADMINS
包含這三位管理員:
User_Alias ADMINS = admin1, admin2, admin3
接下來,建立一個命令別名 MANAGE_CMDS
包含管理命令,例如重啟服務和查看系統日誌:
Cmnd_Alias MANAGE_CMDS = /usr/sbin/service apache2 restart, /usr/sbin/service nginx restart, /usr/bin/tail -f /var/log/syslog
最後,將別名用於設定這三位管理員的權限:
ADMINS ALL=(ALL) MANAGE_CMDS
這樣一來,您不需要在 /etc/sudoers
中重複列出每個管理員和每個管理命令,而是使用別名來簡化設定,使其更容易閱讀和管理。
常見問題解答
- 什麼時候應該使用
su
,什麼時候應該使用sudo
?- 應該使用
su
切換到超級用戶帳戶,以執行需要完全特權的操作。而sudo
應該用於普通用戶執行需要特權的特定命令。
- 應該使用
- 如何添加用戶到 sudo 群組?
- 可以運行
sudo usermod -aG sudo 用户名
命令,其中 “用户名” 是您要添加的用戶名稱。
- 可以運行
延伸閱讀
- 中文參考資料:
- 英文參考資料:
延伸閱讀:Linux 系統的連結檔 links 是什麼意思?5分鐘搞清楚硬連結軟連結學會 Linux ln 指令與教學
延伸閱讀:什麼是 Linux lsof ? 5分鐘學會管理行程和檔案的用法教學與範例
One Comment