su?命令介紹及主要用法
首先需要解釋下?su?代表什么意思。
之前一直以為?su?是?super user,查閱資料之后才知道原來表示?switch user。
知道?su?是由什么縮寫來的之后,那么它提供的功能就顯而易見了,就是切換用戶。
-?參數
su?的一般使用方法是:
su??`
或者
su?-?`
兩種方法只差了一個字符?-,會有比較大的差異:
如果加入了?-?參數,那么是一種?login-shell?的方式,意思是說切換到另一個用戶?
如果沒有加入?-?參數,那么是一種?non-login-shell?的方式,意思是說我現在切換到了?
光解釋會比較抽象,我們看一個例子就比較容易理解了。
我們首先從 ubuntu 用戶以?non-login-shell?的方式切換到 root 用戶,比較兩種用戶狀態下環境變量中?PWD?的值(su?命令不跟任何?
haodao@local:~$?env?|?grep?ubuntu USER=ubuntu PWD=/home/ubuntu?????????????????????????????????????????#?是?/home/ubuntu HOME=/home/ubuntu #?省略...... haodao@local:~$?su???????????????????????????????????????#?non-login-shell?方式 Password:????????????????????????????????????????????????#?輸入?root?用戶登錄密碼 haodao@local:/home/ubuntu#?env?|?grep?ubuntu PWD=/home/ubuntu?????????????????????????????????????????#?可以發現還是?/home/ubuntu haodao@local:/home/ubuntu#
我們的確是切換到 root 用戶了,但是 shell 環境中的變量并沒有改變,還是用之前 ubuntu 用戶的環境變量。
接著我們從 ubuntu 用戶以?login-shell?的方式切換到 root 用戶,同樣比較兩種用戶狀態下環境變量中?PWD?的值:
haodao@local:~$?env?|?grep?ubuntu USER=ubuntu PWD=/home/ubuntu???????????????????????????????#?是?/home/ubuntu HOME=/home/ubuntu #?省略....... haodao@local:~$?su?-???????????????????????????#?是?login-shell?方式 Password: haodao@local:~#?env?|?grep?root USER=root PWD=/root??????????????????????????????????????#?已經變成?/root?了 HOME=/root MAIL=/var/mail/root LOGNAME=root haodao@local:~#
可以看到用?login-shell?的方式切換用戶的話,shell 中的環境變量也跟著改變了。
總結:具體使用哪種方式切換用戶看個人需求:
如果不想因為切換到另一個用戶導致自己在當前用戶下的設置不可用,那么用?non-login-shell?的方式;
如果切換用戶后,需要用到該用戶的各種環境變量(不同用戶的環境變量設置一般是不同的),那么使用?login-shell?的方式。
切換到指定用戶
前面已經介紹了,如果?su?命令后面不跟任何?
haodao@local:~$?su?- Password:???????????????????????????????????????#?root?用戶的密碼 haodao@local:/home/ubuntu#
因為我們在?1. 準備工作?部分已經新建了一個 test_user 用戶,并且我們也知道 test_user 用戶的登錄密碼(root 用戶設置的),我們就能從 ubuntu 用戶切換到 test_user 用戶:
haodao@local:~$?su?-?test_user Password:???????????????????????????????????????#?test_user?用戶的密碼 $
-c?參數
前面的方法中,我們都是先切換到另一個用戶(root 或者 test_user),在哪個用戶的狀態下執行命令,最后輸入?exit?返回當前 ubuntu 用戶。
還有一種方式是:不需要先切換用戶再執行命令,可以直接在當前用戶下,以另一個用戶的方式執行命令,執行結束后就返回當前用戶。這就得用到?-c?參數。
具體使用方法是:
su?-?-c?"指令串"???????????????????????????????????#?以?root?的方式執行?"指令串"
看個例子:
haodao@local:~$?cat?/etc/shadow cat:?/etc/shadow:?Permission?denied????????????????#?ubuntu?用戶不能直接查看?/etc/shadow?文件內容 haodao@local:~$?su?-?-c?"tail?-n?4?/etc/shadow" Password:??????????????????????????????????????????#?輸入?root?用戶密碼 ubuntu:$1$fZKcWEDI$uwZ64uFvVbwpHTbCSgim0/07::: ntp1775299999:: mysql1837699999:: test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07::: haodao@local:~$????????????????????????????????????#?執行完馬上返回?ubuntu?用戶而不是?root?用戶
這種執行方式和后面要介紹的?sudo?很像,都是臨時申請一下 root 用戶的權限。但還是有差異,我們接著往后看。
sudo?命令介紹及主要用法
sudo?的英文全稱是?super user do,即以超級用戶(root 用戶)的方式執行命令。這里的?sudo?和之前?su?表示的?switch user?是不同的,這點需要注意,很容易搞混。
我們先介紹?sudo?命令能做什么事情,然后說明為何能做到這些,以及如何做到這些。
主要用法
我們在 Linux 中經常會碰到?Permission denied?這種情況,比如以 ubuntu 用戶的身份查看?/etc/shadow?的內容。因為這個文件的內容是只有 root 用戶能查看的。
那如果我們想要查看怎么辦呢?這時候就可以使用?sudo?:
haodao@local:~$?tail?-n?3?/etc/shadow tail:?cannot?open?'/etc/shadow'?for?reading:?Permission?denied??????#?沒有權限 haodao@local:~$?sudo?!!????????????????????????????????????#?跟兩個驚嘆號 sudo?tail?-n?3?/etc/shadow ntp1775299999:: mysql1837699999:: test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07::: haodao@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?文件的內容:
haodao@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 用戶):
haodao@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?:
haodao@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 ntp1775299999:: mysql1837699999:: test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07::: $
可以看到,現在已經可以使用?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?方式。
編輯:黃飛
評論
查看更多