linux 中 su 與 sudo 的區別
su 命令介紹及主要用法
首先需要解釋下
su代表什麼意思。
之前一直以爲
su是super user,查閱資料之後才知道原來表示switch user。
知道
su是由什麼縮寫來的之後,那麼它提供的功能就顯而易見了,就是切換用戶。
- 參數
su 的一般使用方法是:
su `<user_name>`
或者
su - `<user_name>`
兩種方法只差了一個字符
-,會有比較大的差異:
-
如果加入了
-參數,那麼是一種login-shell的方式,意思是說切換到另一個用戶<user_name>之後,當前的 shell 會加載<user_name>對應的環境變量和各種設置; -
如果沒有加入
-參數,那麼是一種non-login-shell的方式,意思是說我現在切換到了<user_name>,但是當前的 shell 還是加載切換之前的那個用戶的環境變量以及各種設置。
光解釋會比較抽象,我們看一個例子就比較容易理解了。
我們首先從 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 中的環境變量也跟着改變了。
總結:具體使用哪種方式切換用戶看個人需求:
-
如果不想因爲切換到另一個用戶導致自己在當前用戶下的設置不可用,那麼用
non-login-shell的方式; -
如果切換用戶後,需要用到該用戶的各種環境變量(不同用戶的環境變量設置一般是不同的),那麼使用
login-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 su -後,需要提供當前用戶的登錄密碼,也就是 ubuntu 用戶的密碼; -
後者輸入
su -後,需要提供 root 用戶的登錄密碼。
還有一個命令:
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
解釋下每一行的格式:
-
第一個表示用戶名,如
root、ubuntu等; -
接下來等號左邊的
ALL表示允許從任何主機登錄當前的用戶賬戶; -
等號右邊的
ALL表示:這一行行首對一個的用戶可以切換到系統中任何一個其它用戶; -
行尾的
ALL表示:當前行首的用戶,能以 root 用戶的身份下達什麼命令,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 部分第二條,這篇文章不再贅述。
二者的差異對比
我們已經看到:
-
使用
su -,提供 root 賬戶的密碼,可以切換到 root 用戶; -
使用
sudo su -,提供當前用戶的密碼,也可以切換到 root 用戶
兩種方式的差異也顯而易見:如果我們的 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