之前一直對(duì) su 和 sudo 這兩個(gè)命令犯迷糊,最近專門搜了這方面的資料,總算是把兩者的關(guān)系以及用法搞清楚了,這篇文章來(lái)系統(tǒng)總結(jié)一下。
1. 準(zhǔn)備工作
因?yàn)楸酒┛椭猩婕暗接脩羟袚Q,所以我需要提前準(zhǔn)備好幾個(gè)測(cè)試用戶,方便后續(xù)切換。
Linux 中新建用戶的命令是 useradd ,一般系統(tǒng)中這個(gè)命令對(duì)應(yīng)的路徑都在 PATH 環(huán)境變量里,如果直接輸入 useradd 不管用的話,就用絕對(duì)路徑名的方式:/usr/sbin/useradd 。
useradd 新建用戶命令只有 root 用戶才能執(zhí)行,我們先從普通用戶 ubuntu 切換到 root 用戶(如何切換后文會(huì)介紹):
ubuntu@VM-0-14-ubuntu:~$su-
Password:#輸入root用戶登錄密碼
root@VM-0-14-ubuntu:~#useradd-mtest_user#帶上-m參數(shù)
root@VM-0-14-ubuntu:~#ls/home
test_userubuntu#可以看到/home目錄下面有兩個(gè)用戶了
因?yàn)檫€沒(méi)有給新建的用戶 test_user 設(shè)置登錄密碼,這就導(dǎo)致我們無(wú)法從普通用戶 ubuntu 切換到 test_user,所以接下來(lái),我們需要用 root 來(lái)設(shè)置 test_user 的登錄密碼。需要用到 passwd 命令:
root@VM-0-14-ubuntu:~#passwdtest_user
EnternewUNIXpassword:#輸出test_user的密碼
RetypenewUNIXpassword:
passwd:passwordupdatedsuccessfully
root@VM-0-14-ubuntu:~#
接著我們輸入 exit 退出 root 用戶到 普通用戶 ubuntu:
root@VM-0-14-ubuntu:~#exit
logout
ubuntu@VM-0-14-ubuntu:~$
可以看到,命令提示符前面已經(jīng)由 root 變成 ubuntu,說(shuō)明我們現(xiàn)在的身份是 ubuntu 用戶。
2. su 命令介紹及主要用法
首先需要解釋下 su 代表什么意思。
之前一直以為 su 是 super user,查閱資料之后才知道原來(lái)表示 switch user。
知道 su 是由什么縮寫來(lái)的之后,那么它提供的功能就顯而易見(jiàn)了,就是切換用戶。
2.1 - 參數(shù)
su 的一般使用方法是:
su<user_name>
或者
su-<user_name>
兩種方法只差了一個(gè)字符 -,會(huì)有比較大的差異:
-
如果加入了-參數(shù),那么是一種 login-shell 的方式,意思是說(shuō)切換到另一個(gè)用戶
之后,當(dāng)前的 shell 會(huì)加載 對(duì)應(yīng)的環(huán)境變量和各種設(shè)置; -
如果沒(méi)有加入-參數(shù),那么是一種 non-login-shell 的方式,意思是說(shuō)我現(xiàn)在切換到了
,但是當(dāng)前的 shell 還是加載切換之前的那個(gè)用戶的環(huán)境變量以及各種設(shè)置。
光解釋會(huì)比較抽象,我們看一個(gè)例子就比較容易理解了。
我們首先從 ubuntu 用戶以 non-login-shell 的方式切換到 root 用戶,比較兩種用戶狀態(tài)下環(huán)境變量中 PWD 的值(su 命令不跟任何
ubuntu@VM-0-14-ubuntu:~$env|grepubuntu
USER=ubuntu
PWD=/home/ubuntu#是/home/ubuntu
HOME=/home/ubuntu
#省略......
ubuntu@VM-0-14-ubuntu:~$su#non-login-shell方式
Password:#輸入root用戶登錄密碼
root@VM-0-14-ubuntu:/home/ubuntu#env|grepubuntu
PWD=/home/ubuntu#可以發(fā)現(xiàn)還是/home/ubuntu
root@VM-0-14-ubuntu:/home/ubuntu#
我們的確是切換到 root 用戶了,但是 shell 環(huán)境中的變量并沒(méi)有改變,還是用之前 ubuntu 用戶的環(huán)境變量。
接著我們從 ubuntu 用戶以 login-shell 的方式切換到 root 用戶,同樣比較兩種用戶轉(zhuǎn)臺(tái)下環(huán)境變量中 PWD 的值:
ubuntu@VM-0-14-ubuntu:~$env|grepubuntu
USER=ubuntu
PWD=/home/ubuntu#是/home/ubuntu
HOME=/home/ubuntu
#省略.......
ubuntu@VM-0-14-ubuntu:~$su-#是login-shell方式
Password:
root@VM-0-14-ubuntu:~#env|greproot
USER=root
PWD=/root#已經(jīng)變成/root了
HOME=/root
MAIL=/var/mail/root
LOGNAME=root
root@VM-0-14-ubuntu:~#
可以看到用 login-shell 的方式切換用戶的話,shell 中的環(huán)境變量也跟著改變了。
總結(jié):具體使用哪種方式切換用戶看個(gè)人需求:
-
如果不想因?yàn)榍袚Q到另一個(gè)用戶導(dǎo)致自己在當(dāng)前用戶下的設(shè)置不可用,那么用 non-login-shell 的方式;
-
如果切換用戶后,需要用到該用戶的各種環(huán)境變量(不同用戶的環(huán)境變量設(shè)置一般是不同的),那么使用 login-shell 的方式。
2.2 切換到指定用戶
前面已經(jīng)介紹了,如果 su 命令后面不跟任何,那么默認(rèn)是切換到 root 用戶:
ubuntu@VM-0-14-ubuntu:~$su-
Password:#root用戶的密碼
root@VM-0-14-ubuntu:/home/ubuntu#
因?yàn)槲覀冊(cè)?1. 準(zhǔn)備工作 部分已經(jīng)新建了一個(gè) test_user 用戶,并且我們也知道 test_user 用戶的登錄密碼(root 用戶設(shè)置的),我們就能從 ubuntu 用戶切換到 test_user 用戶:
ubuntu@VM-0-14-ubuntu:~$su-test_user
Password:#test_user用戶的密碼
$
2.3 -c 參數(shù)
前面的方法中,我們都是先切換到另一個(gè)用戶(root 或者 test_user),在哪個(gè)用戶的狀態(tài)下執(zhí)行命令,最后輸入 exit 返回當(dāng)前 ubuntu 用戶。
還有一種方式是:不需要先切換用戶再執(zhí)行命令,可以直接在當(dāng)前用戶下,以另一個(gè)用戶的方式執(zhí)行命令,執(zhí)行結(jié)束后就返回當(dāng)前用戶。這就得用到 -c 參數(shù)。
另外,Linux 系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺(tái)發(fā)送:面試,可以在線閱讀。
具體使用方法是:
su--c"指令串"#以root的方式執(zhí)行"指令串"
我么看個(gè)例子:
ubuntu@VM-0-14-ubuntu:~$cat/etc/shadow
cat:/etc/shadow:Permissiondenied#ubuntu用戶不能直接查看/etc/shadow文件內(nèi)容
ubuntu@VM-0-14-ubuntu:~$su--c"tail-n4/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:::
ubuntu@VM-0-14-ubuntu:~$#執(zhí)行完馬上返回ubuntu用戶而不是root用戶
這種執(zhí)行方式和后面要介紹的 sudo 很像,都是臨時(shí)申請(qǐng)一下 root 用戶的權(quán)限。但還是有差異,我們接著往后看。
3. sudo 命令介紹及主要用法
首先還是解釋下 sudo 命令是什么意思。
sudo 的英文全稱是 super user do,即以超級(jí)用戶(root 用戶)的方式執(zhí)行命令。這里的 sudo 和之前 su 表示的 switch user 是不同的,這點(diǎn)需要注意,很容易搞混。
我們先介紹 sudo 命令能做什么事情,然后說(shuō)明為何能做到這些,以及如何做到這些。
我們開(kāi)始。
3.1 主要用法
我們?cè)?Linux 中經(jīng)常會(huì)碰到 Permission denied 這種情況,比如以 ubuntu 用戶的身份查看 /etc/shadow 的內(nèi)容。因?yàn)檫@個(gè)文件的內(nèi)容是只有 root 用戶能查看的。
那如果我們想要查看怎么辦呢?這時(shí)候就可以使用 sudo :
ubuntu@VM-0-14-ubuntu:~$tail-n3/etc/shadow
tail:cannotopen'/etc/shadow'forreading:Permissiondenied#沒(méi)有權(quán)限
ubuntu@VM-0-14-ubuntu:~$sudo!!#跟兩個(gè)驚嘆號(hào)
sudotail-n3/etc/shadow
ntp:*:17752:0:99999:7:::
mysql:!:18376:0:99999:7:::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::
ubuntu@VM-0-14-ubuntu:~$
實(shí)例中,我們使用了 sudo !! 這個(gè)小技巧,表示重復(fù)上面輸入的命令,只不過(guò)在命令最前面加上 sudo 。
因?yàn)槲乙呀?jīng)設(shè)置了 sudo 命令不需要輸入密碼,所以這里 sudo !! 就能直接輸出內(nèi)容。如果沒(méi)有設(shè)置的話,需要輸入當(dāng)前這個(gè)用戶的密碼,例如本例中,我就應(yīng)該輸入 ubuntu 用戶的登錄密碼。
兩次相鄰的 sudo 操作,如果間隔在 5min 之內(nèi),第二次輸入 sudo 不需要重新輸入密碼;如果超過(guò) 5min,那么再輸入 sudo 時(shí),又需要輸入密碼。所以一個(gè)比較省事的方法是設(shè)置 sudo 操作不需要密碼。后面介紹如何設(shè)置。
sudo 除了以 root 用戶的權(quán)限執(zhí)行命令外,還有其它幾個(gè)用法,這里做簡(jiǎn)單介紹。
切換到 root 用戶:
sudosu-
這種方式也能以 login-shell 的方式切換到 root 用戶,但是它和 su - 方法是有區(qū)別的:
-
前者輸入 sudo su - 后,需要提供當(dāng)前用戶的登錄密碼,也就是 ubuntu 用戶的密碼;
-
后者輸入 su - 后,需要提供 root 用戶的登錄密碼。
還有一個(gè)命令:
sudo-i
這個(gè)命令和 sudo su - 效果一致,也是切換到 root 用戶,也是需要提供當(dāng)前用戶(ubuntu 用戶)的登錄密碼。
我們現(xiàn)在切換到 test_user 用戶,嘗試顯示 /etc/shadow 文件的內(nèi)容:
ubuntu@VM-0-14-ubuntu:~$su-test_user
Password:#test_user的密碼
$sudocat/etc/shadow
[sudo]passwordfortest_user:#test_user的密碼
test_userisnotinthesudoersfile.Thisincidentwillbereported.
$
我們會(huì)看到倒數(shù)第二行中的錯(cuò)誤提示信息,我們無(wú)法查看 /etc/shadow 的內(nèi)容,這是為什么?為什么 ubuntu 可以使用 sudo 但是 test_user 不行呢?
這就涉及到 sudo 的工作原理了。
3.2 sudo 工作原理
一個(gè)用戶能否使用 sudo 命令,取決于 /etc/sudoers 文件的設(shè)置。
從 3.1 節(jié)中我們已經(jīng)看到,ubuntu 用戶可以正常使用 sudo ,但是 test_user 用戶卻無(wú)法使用,這是因?yàn)?/etc/sudoers 文件里沒(méi)有配置 test_user。
/etc/sudoers 也是一個(gè)文本文件,但是因其有特定的語(yǔ)法,我們不要直接用 vim 或者 vi 來(lái)編輯它,需要用 visudo 這個(gè)命令。輸入這個(gè)命令之后就能直接編輯 /etc/sudoers 這個(gè)文件了。
需要說(shuō)明的是,只有 root 用戶有權(quán)限使用 visudo 命令。
我們先來(lái)看下輸入 visudo 命令后顯示的內(nèi)容。
輸入(root 用戶):
root@VM-0-14-ubuntu:~#visudo
輸出:
#Userprivilegespecification
rootALL=(ALL:ALL)ALL
#Membersoftheadmingroupmaygainrootprivileges
%adminALL=(ALL)ALL
#Allowmembersofgroupsudotoexecuteanycommand
%sudoALL=(ALL:ALL)ALL
#Seesudoers(5)formoreinformationon"#include"directives:
#includedir/etc/sudoers.d
ubuntuALL=(ALL:ALL)NOPASSWD:ALL
解釋下每一行的格式:
-
第一個(gè)表示用戶名,如 root 、ubuntu 等;
-
接下來(lái)等號(hào)左邊的 ALL 表示允許從任何主機(jī)登錄當(dāng)前的用戶賬戶;
-
等號(hào)右邊的 ALL 表示:這一行行首對(duì)一個(gè)的用戶可以切換到系統(tǒng)中任何一個(gè)其它用戶;
-
行尾的 ALL 表示:當(dāng)前行首的用戶,能以 root 用戶的身份下達(dá)什么命令,ALL 表示可以下達(dá)任何命令。
我們還注意到 ubuntu 對(duì)應(yīng)的那一行有個(gè) NOPASSWD 關(guān)鍵字,這就是表明 ubuntu 這個(gè)用戶在請(qǐng)求 sudo 時(shí)不需要輸入密碼,到這里就解釋了前面的問(wèn)題。
同時(shí)我們注意到,這個(gè)文件里并沒(méi)有 test_user 對(duì)應(yīng)的行,這也就解釋了為什么 test_user 無(wú)法使用 sudo 命令。
接下來(lái),我們嘗試將 test_user 添加到 /etc/sudoers 文件中,使 test_user 也能使用 sudo 命令。我們?cè)谧詈笠恍刑砑樱?/span>
test_userALL=(ALL:ALL)ALL#test_user使用sudo需要提供test_user的密碼
接下來(lái)我們?cè)僭?test_user 賬戶下執(zhí)行 sudo :
ubuntu@VM-0-14-ubuntu:~$su-test_user
Password:
$tail-n3/etc/shadow
tail:cannotopen'/etc/shadow'forreading:Permissiondenied
$sudotail-n3/etc/shadow#加上sudo
ntp:*:17752:0:99999:7:::
mysql:!:18376:0:99999:7:::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::
$
可以看到,現(xiàn)在已經(jīng)可以使用 sudo 了。
3.3 思考
我們已經(jīng)看到了,如果一個(gè)用戶在 /etc/sudoers 文件中,那么它就具有 sudo 權(quán)限,就能通過(guò) sudo su - 或者 sudo -i 等命令切換到 root 用戶了,那這時(shí)這個(gè)用戶就變成 root 用戶了,那這不對(duì)系統(tǒng)造成很大的威脅嗎?
實(shí)際上的確是這樣的。所以如果在編輯 /etc/sudoers 文件賦予某種用戶 sudo 權(quán)限時(shí),必須要確定該用戶是可信任的,不會(huì)對(duì)系統(tǒng)造成惡意破壞,否則將所有 root 權(quán)限都賦予該用戶將會(huì)有非常大的危險(xiǎn)。
當(dāng)然,root 用戶也可以編輯 /etc/sudoers 使用戶只具備一部分權(quán)限,即只能執(zhí)行一小部分命令。有興趣的讀者可以參考 Reference 部分第二條,這篇文章不再贅述。
4. 二者的差異對(duì)比
我們已經(jīng)看到:
-
使用 su - ,提供 root 賬戶的密碼,可以切換到 root 用戶;
-
使用 sudo su - ,提供當(dāng)前用戶的密碼,也可以切換到 root 用戶
兩種方式的差異也顯而易見(jiàn):如果我們的 Linux 系統(tǒng)有很多用戶需要使用的話,前者要求所有用戶都知道 root 用戶的密碼,這顯然是非常危險(xiǎn)的;后者是不需要暴露 root 賬戶密碼的,用戶只需要輸入自己的賬戶密碼就可以,而且哪些用戶可以切換到 root,這完全是受 root 控制的(root 通過(guò)設(shè)置 /etc/sudoers 實(shí)現(xiàn)的),這樣系統(tǒng)就安全很多了。
一般都是推薦使用 sudo 方式。
References
-
https://www.rootusers.com/the-difference-between-su-and-sudo-commands-in-linux/
-
《鳥(niǎo)哥的 Linux 私房菜》13.4 節(jié):使用者身份切換
-
https://github.com/ustclug/Linux101-docs/blob/master/docs/Ch05/index.md
-
https://www.maketecheasier.com/differences-between-su-sudo-su-sudo-s-sudo-i/
-
https://stackoverflow.com/questions/35999671/whats-the-difference-between-sudo-i-and-sudo-su?r=SearchResults
-
https://www.zhihu.com/question/51746286
-
https://www.linuxidc.com/Linux/2017-06/144916.htm
來(lái)源:Jun Tao
地址:https://tanjuntao.github.io/
-
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210391 -
命令
+關(guān)注
關(guān)注
5文章
696瀏覽量
22109
原文標(biāo)題:Linux 命令 su 和 sudo 的區(qū)別
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論