前言
大家在自己實(shí)驗(yàn)服務(wù)器上可能不會(huì)用到su與sudo命令,因?yàn)橐恢庇弥鴕oot用戶進(jìn)行操作。但是在實(shí)際生產(chǎn)環(huán)境,運(yùn)維人員是不會(huì)拿到root的權(quán)限的。尤其在甲方,更加的難給到運(yùn)維root權(quán)限。我就遇到過(guò)此類(lèi)現(xiàn)象,之前實(shí)習(xí)生讓安裝部署個(gè)mysql、redis等中間件時(shí),他還傻傻問(wèn)人家甲方用root用戶密碼,這不被甲方噴就算好的了。實(shí)際上通過(guò)su與sudo是足夠完成的了。本文也帶大家一起來(lái)使用su與sudo,避免你有一天被人家噴不懂用!
su命令介紹及主要用法
首先需要解釋下su代表什么意思。
之前一直以為su是super user,查閱資料之后才知道原來(lái)表示switch user。
知道su是由什么縮寫(xiě)來(lái)的之后,那么它提供的功能就顯而易見(jiàn)了,就是切換用戶。
-參數(shù)
su的一般使用方法是:
su``
或者
su-``
兩種方法只差了一個(gè)字符-,會(huì)有比較大的差異:
如果加入了-參數(shù),那么是一種login-shell的方式,意思是說(shuō)切換到另一個(gè)用戶
如果沒(méi)有加入-參數(shù),那么是一種non-login-shell的方式,意思是說(shuō)我現(xiàn)在切換到了
光解釋會(huì)比較抽象,我們看一個(gè)例子就比較容易理解了。
我們首先從 ubuntu 用戶以non-login-shell的方式切換到 root 用戶,比較兩種用戶狀態(tài)下環(huán)境變量中PWD的值(su命令不跟任何
rumenz@local:~$env|grepubuntu USER=ubuntu PWD=/home/ubuntu#是/home/ubuntu HOME=/home/ubuntu #省略...... rumenz@local:~$su#non-login-shell方式 Password:#輸入root用戶登錄密碼 rumenz@local:/home/ubuntu#env|grepubuntu PWD=/home/ubuntu#可以發(fā)現(xiàn)還是/home/ubuntu rumenz@local:/home/ubuntu#
我們的確是切換到 root 用戶了,但是 shell 環(huán)境中的變量并沒(méi)有改變,還是用之前 ubuntu 用戶的環(huán)境變量。
接著我們從 ubuntu 用戶以login-shell的方式切換到 root 用戶,同樣比較兩種用戶狀態(tài)下環(huán)境變量中PWD的值:
rumenz@local:~$env|grepubuntu USER=ubuntu PWD=/home/ubuntu#是/home/ubuntu HOME=/home/ubuntu #省略....... rumenz@local:~$su-#是login-shell方式 Password: rumenz@local:~#env|greproot USER=root PWD=/root#已經(jīng)變成/root了 HOME=/root MAIL=/var/mail/root LOGNAME=root rumenz@local:~#
可以看到用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的方式。
切換到指定用戶
前面已經(jīng)介紹了,如果su命令后面不跟任何
rumenz@local:~$su- Password:#root用戶的密碼 rumenz@local:/home/ubuntu#
因?yàn)槲覀冊(cè)?. 準(zhǔn)備工作部分已經(jīng)新建了一個(gè) test_user 用戶,并且我們也知道 test_user 用戶的登錄密碼(root 用戶設(shè)置的),我們就能從 ubuntu 用戶切換到 test_user 用戶:
rumenz@local:~$su-test_user Password:#test_user用戶的密碼 $
-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ù)。
具體使用方法是:
su--c"指令串"#以root的方式執(zhí)行"指令串"
看個(gè)例子:
rumenz@local:~$cat/etc/shadow cat:/etc/shadow:Permissiondenied#ubuntu用戶不能直接查看/etc/shadow文件內(nèi)容 rumenz@local:~$su--c"tail-n4/etc/shadow" Password:#輸入root用戶密碼 ubuntu:$1$fZKcWEDI$uwZ64uFvVbwpHTbCSgim0/07::: ntp1775299999:: mysql1837699999:: test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07::: rumenz@local:~$#執(zhí)行完馬上返回ubuntu用戶而不是root用戶
這種執(zhí)行方式和后面要介紹的sudo很像,都是臨時(shí)申請(qǐng)一下 root 用戶的權(quán)限。但還是有差異,我們接著往后看。
sudo命令介紹及主要用法
sudo的英文全稱(chēng)是super user do,即以超級(jí)用戶(root 用戶)的方式執(zhí)行命令。這里的sudo和之前su表示的switch user是不同的,這點(diǎn)需要注意,很容易搞混。
我們先介紹sudo命令能做什么事情,然后說(shuō)明為何能做到這些,以及如何做到這些。
主要用法
我們?cè)?Linux 中經(jīng)常會(huì)碰到Permission denied這種情況,比如以 ubuntu 用戶的身份查看/etc/shadow的內(nèi)容。因?yàn)檫@個(gè)文件的內(nèi)容是只有 root 用戶能查看的。
那如果我們想要查看怎么辦呢?這時(shí)候就可以使用sudo:
rumenz@local:~$tail-n3/etc/shadow tail:cannotopen'/etc/shadow'forreading:Permissiondenied#沒(méi)有權(quán)限 rumenz@local:~$sudo!!#跟兩個(gè)驚嘆號(hào) sudotail-n3/etc/shadow ntp1775299999:: mysql1837699999:: test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07::: rumenz@local:~$
實(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)容:
rumenz@local:~$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的工作原理了。
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 用戶):
rumenz@local:~#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è)谧詈笠恍刑砑樱?/p>
test_userALL=(ALL:ALL)ALL#test_user使用sudo需要提供test_user的密碼
接下來(lái)我們?cè)僭?test_user 賬戶下執(zhí)行sudo:
rumenz@local:~$su-test_user Password: $tail-n3/etc/shadow tail:cannotopen'/etc/shadow'forreading:Permissiondenied $sudotail-n3/etc/shadow#加上sudo ntp1775299999:: mysql1837699999:: test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07::: $
可以看到,現(xiàn)在已經(jīng)可以使用sudo了。
思考
我們已經(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 部分第二條,這篇文章不再贅述。
二者的差異對(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方式。
審核編輯:劉清
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
614瀏覽量
29904 -
Shell
+關(guān)注
關(guān)注
1文章
375瀏覽量
25374 -
Ubuntu系統(tǒng)
+關(guān)注
關(guān)注
0文章
93瀏覽量
4620
原文標(biāo)題:如果你不懂su與sudo用法,可能會(huì)被甲方噴的!
文章出處:【微信號(hào):浩道linux,微信公眾號(hào):浩道linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
常見(jiàn)的shell命令之其他命令
嵌入式學(xué)習(xí)-常見(jiàn)的shell命令之其他命令
在 Linux 中運(yùn)行 sudo 命令不需要密碼
Linux中su和sudo命令有什么區(qū)別
如何使用sudo命令以及選項(xiàng)
值得考慮的4個(gè)最佳Linux sudo命令替代方案
Linux中root和sudo的用法與區(qū)別
Linux命令su和sudo的區(qū)別
首個(gè)Rust版sudo發(fā)布!
什么是sudo rm -rf?為什么這個(gè)命令如此危險(xiǎn)?
總結(jié)linux命令行的主要用法
Linux lsof命令的基本用法
su與sudo命令介紹及主要用法
評(píng)論