linux 中 su 與 sudo 的區別

su 命令介紹及主要用法

首先需要解釋下 su 代表什麼意思。

之前一直以爲 susuper user,查閱資料之後才知道原來表示 switch user

知道 su 是由什麼縮寫來的之後,那麼它提供的功能就顯而易見了,就是切換用戶

- 參數

su 的一般使用方法是:

su  `<user_name>`

或者

su - `<user_name>`

兩種方法只差了一個字符 -,會有比較大的差異:

光解釋會比較抽象,我們看一個例子就比較容易理解了。

我們首先從 ubuntu 用戶以 non-login-shell 的方式切換到 root 用戶,比較兩種用戶狀態下環境變量中 PWD 的值(su 命令不跟任何 <user_name> ,默認切換到 root 用戶):

rumenz@local:~$ env | grep ubuntu
USER=ubuntu
PWD=/home/ubuntu                                         # 是 /home/ubuntu
HOME=/home/ubuntu
# 省略......
rumenz@local:~$ su                                       # non-login-shell 方式
Password:                                                # 輸入 root 用戶登錄密碼
rumenz@local:/home/ubuntu# env | grep ubuntu
PWD=/home/ubuntu                                         # 可以發現還是 /home/ubuntu
rumenz@local:/home/ubuntu#

我們的確是切換到 root 用戶了,但是 shell 環境中的變量並沒有改變,還是用之前 ubuntu 用戶的環境變量。

接着我們從 ubuntu 用戶以 login-shell 的方式切換到 root 用戶,同樣比較兩種用戶狀態下環境變量中 PWD 的值:

rumenz@local:~$ env | grep ubuntu
USER=ubuntu
PWD=/home/ubuntu                               # 是 /home/ubuntu
HOME=/home/ubuntu
# 省略.......
rumenz@local:~$ su -                           # 是 login-shell 方式
Password:
rumenz@local:~# env | grep root
USER=root
PWD=/root                                      # 已經變成 /root 了
HOME=/root
MAIL=/var/mail/root
LOGNAME=root
rumenz@local:~#

可以看到用 login-shell 的方式切換用戶的話,shell 中的環境變量也跟着改變了。

總結:具體使用哪種方式切換用戶看個人需求:

切換到指定用戶

前面已經介紹了,如果 su 命令後面不跟任何 <user_name>,那麼默認是切換到 root 用戶:

rumenz@local:~$ su -
Password:                                       # root 用戶的密碼
rumenz@local:/home/ubuntu#

因爲我們在 1. 準備工作 部分已經新建了一個 test_user 用戶,並且我們也知道 test_user 用戶的登錄密碼(root 用戶設置的),我們就能從 ubuntu 用戶切換到 test_user 用戶:

rumenz@local:~$ su - test_user
Password:                                       # test_user 用戶的密碼
$

-c 參數

前面的方法中,我們都是先切換到另一個用戶(root 或者 test_user),在哪個用戶的狀態下執行命令,最後輸入 exit 返回當前 ubuntu 用戶。

還有一種方式是:不需要先切換用戶再執行命令,可以直接在當前用戶下,以另一個用戶的方式執行命令,執行結束後就返回當前用戶。這就得用到 -c 參數。

具體使用方法是:

su - -c "指令串"                                   # 以 root 的方式執行 "指令串"

看個例子:

rumenz@local:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied                # ubuntu 用戶不能直接查看 /etc/shadow 文件內容

rumenz@local:~$ su - -c "tail -n 4 /etc/shadow"
Password:                                          # 輸入 root 用戶密碼
ubuntu:$1$fZKcWEDI$uwZ64uFvVbwpHTbCSgim0/:18352:0:99999:7:::
ntp:*:17752:0:99999:7:::
mysql:!:18376:0:99999:7:::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::
rumenz@local:~$                                    # 執行完馬上返回 ubuntu 用戶而不是 root 用戶

這種執行方式和後面要介紹的 sudo 很像,都是臨時申請一下 root 用戶的權限。但還是有差異,我們接着往後看。

sudo 命令介紹及主要用法

sudo 的英文全稱是 super user do,即以超級用戶(root 用戶)的方式執行命令。這裏的 sudo 和之前 su 表示的 switch user 是不同的,這點需要注意,很容易搞混。

我們先介紹 sudo 命令能做什麼事情,然後說明爲何能做到這些,以及如何做到這些。

主要用法

我們在 Linux 中經常會碰到 Permission denied 這種情況,比如以 ubuntu 用戶的身份查看 /etc/shadow 的內容。因爲這個文件的內容是隻有 root 用戶能查看的。

那如果我們想要查看怎麼辦呢?這時候就可以使用 sudo :

rumenz@local:~$ tail -n 3 /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied      # 沒有權限
rumenz@local:~$ sudo !!                                    # 跟兩個驚歎號
sudo tail -n 3 /etc/shadow
ntp:*:17752:0:99999:7:::
mysql:!:18376:0:99999:7:::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::
rumenz@local:~$

實例中,我們使用了 sudo !! 這個小技巧,表示重複上面輸入的命令,只不過在命令最前面加上 sudo

因爲我已經設置了 sudo 命令不需要輸入密碼,所以這裏 sudo !! 就能直接輸出內容。如果沒有設置的話,需要輸入當前這個用戶的密碼,例如本例中,我就應該輸入 ubuntu 用戶的登錄密碼。

兩次相鄰的 sudo 操作,如果間隔在 5min 之內,第二次輸入 sudo 不需要重新輸入密碼;如果超過 5min,那麼再輸入 sudo 時,又需要輸入密碼。所以一個比較省事的方法是設置 sudo 操作不需要密碼。後面介紹如何設置。

sudo 除了以 root 用戶的權限執行命令外,還有其它幾個用法,這裏做簡單介紹。

切換到 root 用戶:

sudo su -

這種方式也能以 login-shell 的方式切換到 root 用戶,但是它和 su - 方法是有區別的:

還有一個命令:

sudo -i

這個命令和 sudo su - 效果一致,也是切換到 root 用戶,也是需要提供當前用戶(ubuntu 用戶)的登錄密碼。

我們現在切換到 test_user 用戶,嘗試顯示 /etc/shadow 文件的內容:

rumenz@local:~$ su - test_user
Password:                                       # test_user 的密碼
$ sudo cat /etc/shadow
[sudo] password for test_user:                  # test_user 的密碼
test_user is not in the sudoers file.  This incident will be reported.
$

我們會看到倒數第二行中的錯誤提示信息,我們無法查看 /etc/shadow 的內容,這是爲什麼?爲什麼 ubuntu 可以使用 sudo 但是 test_user 不行呢?

這就涉及到 sudo 的工作原理了。

sudo 工作原理

一個用戶能否使用 sudo 命令,取決於 /etc/sudoers 文件的設置。

從 3.1 節中我們已經看到,ubuntu 用戶可以正常使用 sudo ,但是 test_user 用戶卻無法使用,這是因爲 /etc/sudoers 文件裏沒有配置 test_user。

/etc/sudoers 也是一個文本文件,但是因其有特定的語法,我們不要直接用 vim 或者 vi 來編輯它,需要用 visudo 這個命令。輸入這個命令之後就能直接編輯 /etc/sudoers 這個文件了。

需要說明的是,只有 root 用戶有權限使用 visudo 命令。

我們先來看下輸入 visudo 命令後顯示的內容。

輸入(root 用戶):

rumenz@local:~# visudo

輸出:

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
ubuntu  ALL=(ALL:ALL) NOPASSWD: ALL

解釋下每一行的格式:

我們還注意到 ubuntu 對應的那一行有個 NOPASSWD 關鍵字,這就是表明 ubuntu 這個用戶在請求 sudo 時不需要輸入密碼,到這裏就解釋了前面的問題。

同時我們注意到,這個文件裏並沒有 test_user 對應的行,這也就解釋了爲什麼 test_user 無法使用 sudo 命令。

接下來,我們嘗試將 test_user 添加到 /etc/sudoers 文件中,使 test_user 也能使用 sudo 命令。我們在最後一行添加:

test_user  ALL=(ALL:ALL)  ALL       # test_user 使用 sudo 需要提供 test_user 的密碼

接下來我們再在 test_user 賬戶下執行 sudo

rumenz@local:~$ su - test_user
Password:
$ tail -n 3 /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
$ sudo tail -n 3 /etc/shadow                   # 加上 sudo
ntp:*:17752:0:99999:7:::
mysql:!:18376:0:99999:7:::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::
$

可以看到,現在已經可以使用 sudo 了。

思考

我們已經看到了,如果一個用戶在 /etc/sudoers 文件中,那麼它就具有 sudo 權限,就能通過 sudo su - 或者 sudo -i 等命令切換到 root 用戶了,那這時這個用戶就變成 root 用戶了,那這不對系統造成很大的威脅嗎?

實際上的確是這樣的。所以如果在編輯 /etc/sudoers 文件賦予某種用戶 sudo 權限時,必須要確定該用戶是可信任的,不會對系統造成惡意破壞,否則將所有 root 權限都賦予該用戶將會有非常大的危險。

當然,root 用戶也可以編輯 /etc/sudoers 使用戶只具備一部分權限,即只能執行一小部分命令。有興趣的讀者可以參考 Reference 部分第二條,這篇文章不再贅述。

二者的差異對比

我們已經看到:

兩種方式的差異也顯而易見:如果我們的 Linux 系統有很多用戶需要使用的話,前者要求所有用戶都知道 root 用戶的密碼,這顯然是非常危險的;後者是不需要暴露 root 賬戶密碼的,用戶只需要輸入自己的賬戶密碼就可以,而且哪些用戶可以切換到 root,這完全是受 root 控制的(root 通過設置 /etc/sudoers 實現的),這樣系統就安全很多了。

一般都是推薦使用 sudo 方式。

原文: https://tanjuntao.github.io/2020/05/23/Linux-%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95%EF%BC%9Asu-%E5%92%8C-sudo/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/294sp4BJPD2upt3jNqPObg