Linux 命令之 sudo -- 以其他用户身份来执行命令
文章目錄
- 命令介紹
- 原理
- 相關(guān)文件
- 通配符
- 和命令 su 的比較
- 常用選項(xiàng)
- 幾個(gè)重要選項(xiàng)的解讀
- -k 選項(xiàng)
- -s 選項(xiàng)
- -i 選項(xiàng)
- su、sudo su、sudo -i 的區(qū)別
- 查看日志文件
- 參考示例
- 以用戶 mysql 的身份執(zhí)行命令 pwd
- 以用戶 root 的身份執(zhí)行命令 pwd
- 以 root 的權(quán)限執(zhí)行上一條命令
- 以 root 的權(quán)限編輯指定的文件
- 普通用戶切換成 root 身份
- 使用 root 的身份執(zhí)行最近一條指令
- 使用 sudo 切換 Shell 類型
- 切換成指定的用戶
- 顯示當(dāng)前用戶可以用 sudo 執(zhí)行哪些命令
- 通過(guò)加入群組的方式給普通用戶授權(quán)
命令介紹
substitute user identity to do,替換身份去執(zhí)行,縮寫為 sudo。
sudo 命令用來(lái)以其他身份來(lái)執(zhí)行命令,預(yù)設(shè)的身份為 root。在 /etc/sudoers 中設(shè)置了可執(zhí)行 sudo 指令的用戶。若其未經(jīng)授權(quán)的用戶企圖使用 sudo,則會(huì)發(fā)出警告的郵件給管理員。用戶使用 sudo 時(shí),必須先輸入密碼,之后有 5 分鐘的有效期限,超過(guò)期限則必須重新輸入密碼。
簡(jiǎn)單的說(shuō),sudo 是一種權(quán)限管理機(jī)制,管理員可以授權(quán)一些普通用戶去執(zhí)行一些 root 執(zhí)行的操作,而不需要知道 root 的密碼。普通用戶必須在文件 /etc/sudoers 中進(jìn)行有關(guān)授權(quán),才能使用命令 sudo。
更加正確地說(shuō)法是,sudo 允許一個(gè)已授權(quán)用戶以超級(jí)用戶或者其它用戶的角色運(yùn)行一個(gè)命令。當(dāng)然,能做什么不能做什么都是通過(guò)安全策略來(lái)指定的。sudo 支持插件架構(gòu)的安全策略,并能把輸入輸出寫入日志。第三方可以開(kāi)發(fā)并發(fā)布自己的安全策略和輸入輸出日志插件,并讓它們無(wú)縫的和 sudo 一起工作。默認(rèn)的安全策略記錄在 /etc/sudoers 文件中。而安全策略可能需要用戶通過(guò)密碼來(lái)驗(yàn)證他們自己。也就是在用戶執(zhí)行 sudo 命令時(shí)要求用戶輸入自己賬號(hào)的密碼。如果驗(yàn)證失敗,sudo 命令將會(huì)退出。
原理
sudo 使一般用戶不需要知道超級(jí)用戶的密碼即可獲得權(quán)限。首先超級(jí)用戶將普通用戶的名字、可以執(zhí)行的特定命令、按照哪種用戶或用戶組的身份執(zhí)行等信息,登記在特殊的文件中(通常是 /etc/sudoers),即完成對(duì)該用戶的授權(quán)(此時(shí)該用戶稱為“sudoer”);在一般用戶需要取得特殊權(quán)限時(shí),其可在命令前加上 sudo,此時(shí) sudo 將會(huì)詢問(wèn)該用戶自己的密碼(以確認(rèn)終端機(jī)前的是該用戶本人),回答后系統(tǒng)即會(huì)將該命令的進(jìn)程以超級(jí)用戶的權(quán)限運(yùn)行。之后的一段時(shí)間內(nèi)(默認(rèn)為5分鐘,可在 /etc/sudoers 自定義),使用 sudo 不需要再次輸入密碼。
sudo 命令的運(yùn)行,需經(jīng)歷如下幾步:
當(dāng)用戶運(yùn)行 sudo 命令時(shí),系統(tǒng)會(huì)先通過(guò) /etc/sudoers 文件,驗(yàn)證該用戶是否有運(yùn)行 sudo 的權(quán)限;
確定用戶具有使用 sudo 命令的權(quán)限后,還要讓用戶輸入自己的密碼進(jìn)行確認(rèn)。出于對(duì)系統(tǒng)安全性的考慮,如果用戶在默認(rèn)時(shí)間內(nèi)(默認(rèn)是 5 分鐘)不使用 sudo 命令,此后使用時(shí)需要再次輸入密碼;
密碼輸入成功后,才會(huì)執(zhí)行 sudo 命令后接的命令。
顯然,能否使用 sudo 命令,取決于對(duì) /etc/sudoers 文件的配置(默認(rèn)情況下,此文件中只配置有 root 用戶)。默認(rèn)情況下 sudo 命令只有 root 身份可以使用。
相關(guān)文件
配置文件:
/etc/sudoers
/etc/sudoers.d/
時(shí)間戳文件:
/var/db/sudo
日志文件:
/var/log/secure
通配符
?:匹配任意一個(gè)字符 *:匹配任意數(shù)量的任意字符 [wxc]:匹配其中一個(gè)字符 [!wxc]:除了這三個(gè)字符的其它字符 \x:轉(zhuǎn)義 [[alpha]]:表示匹配任意一個(gè)英文字母。示例:/bin/ls [[alpha]]*和命令 su 的比較
相對(duì)于使用 su 命令還需要新切換用戶的密碼,sudo 命令的運(yùn)行只需要知道自己的密碼即可,甚至于,我們可以通過(guò)手動(dòng)修改 sudo 的配置文件,使其無(wú)需任何密碼即可運(yùn)行。
常用選項(xiàng)
| -b | 在后臺(tái)執(zhí)行指令 |
| -e 或 --edit | 編輯文件而非執(zhí)行命令,等效于 sudoedit |
| -i 或 --login | 以目標(biāo)用戶身份登錄 shell,可同時(shí)指定一條命令。其實(shí)就是相當(dāng)于使用目標(biāo)用戶的身份重新登錄 shell |
| -H | 將HOME環(huán)境變量設(shè)為新身份的HOME環(huán)境變量 |
| -k | 結(jié)束密碼的有效期限,也就是下次再執(zhí)行sudo時(shí)便需要輸入密碼。強(qiáng)迫使用者在下一次執(zhí)行 sudo 時(shí)輸入密碼(不論有沒(méi)有超過(guò) N 分鐘) |
| -l | 列出目前用戶可執(zhí)行與無(wú)法執(zhí)行的指令。顯示出自己(執(zhí)行 sudo 的使用者)的權(quán)限。用于顯示當(dāng)前用戶可以用 sudo 執(zhí)行那些命令 |
| -p | 改變?cè)儐?wèn)密碼的提示符號(hào),即可以更改問(wèn)密碼的提示語(yǔ),其中 %u 會(huì)代換為使用者的帳號(hào)名稱,%h 會(huì)顯示主機(jī)名稱 |
| -s<shell> | 執(zhí)行指定的shell。執(zhí)行環(huán)境變量 SHELL 中所指定的 shell ,或是 /etc/passwd 里所指定的 shell |
| -S | 從標(biāo)準(zhǔn)輸入流替代終端來(lái)獲取密碼 |
| -u<用戶> | 以指定的用戶作為新的身份。若不加上此參數(shù),則預(yù)設(shè)以root作為新的身份 |
| -v | 延長(zhǎng)密碼有效期限5分鐘。因?yàn)?sudo 在第一次執(zhí)行時(shí)或是在 N分鐘內(nèi)沒(méi)有執(zhí)行(N 預(yù)設(shè)為五)會(huì)提示輸入密碼,這個(gè)參數(shù)是重新做一次確認(rèn),如果超過(guò)N分鐘,也會(huì)提示輸入密碼 |
| -V | 顯示版本信息 |
| -h | 顯示幫助 |
幾個(gè)重要選項(xiàng)的解讀
-k 選項(xiàng)
考慮下這種情況:
輸入密碼后你剛剛運(yùn)行了幾個(gè) sudo 驅(qū)動(dòng)的命令,而 sudo 會(huì)話默認(rèn)保持 5 分鐘。假設(shè)在這會(huì)話期間,你需要讓某些人訪問(wèn)你的終端,但你不想讓他們可以使用 sudo,你將會(huì)怎么做?沒(méi)錯(cuò),-k 選項(xiàng)允許用戶提前結(jié)束 sudo 會(huì)話的有效期。
以下是 sudo 幫助頁(yè)面的解釋:
-k, --reset-timestamp
不帶任何命令使用時(shí),撤銷用戶緩存的憑據(jù)。換句話講,下一次使用sudo將會(huì)要求輸入密碼。使用這個(gè)參數(shù)不需要密碼,也可以放到一個(gè)
./logout文件中來(lái)撤銷 sudo 權(quán)限。
當(dāng)與一個(gè)命令,或者一個(gè)可能需要密碼的操作一起用時(shí),這個(gè)參數(shù)將會(huì)導(dǎo)致sudo忽略用戶緩存的憑據(jù)。結(jié)果是sudo要求輸入密碼(如果這是被安全策略所要求的),而且不會(huì)更新用戶緩存的憑據(jù)。
-s 選項(xiàng)
有時(shí)你的工作要求你運(yùn)行一堆需要 root 權(quán)限的命令,你不想每次都輸入密碼。你也不想通過(guò)改變/etc/sudoers文件調(diào)整sudo會(huì)話的過(guò)期時(shí)限。
這種情況下,你可以用 sudo 的 -s 選項(xiàng)。以下是 sudo 幫助頁(yè)面的解釋:
-s,–shell
如果設(shè)置了 SHELL 環(huán)境變量或者調(diào)用用戶的密碼數(shù)據(jù)庫(kù)指定了 shell,就運(yùn)行該 shell 。如果指定了命令,命令將會(huì)通過(guò) shell
的 -c參數(shù)將命令傳遞給該 shell 執(zhí)行。如果沒(méi)有指定命令,會(huì)執(zhí)行一個(gè)交互式 shell。
所以,基本上這命令參數(shù)做的是:
1.啟動(dòng)一個(gè)新的 shell,至于是哪一個(gè) shell,參照 SHELL 環(huán)境變量賦值。如果 $SHELL 是空的,將會(huì)用 /etc/passwd 中定義的 shell。
2.如果你用 -s 參數(shù)傳遞了一個(gè)命令名(例如,sudo -s whoami),實(shí)際執(zhí)行的是 sudo /bin/bash -c whoami。
3.如果你沒(méi)有嘗試執(zhí)行其他命令(也就是說(shuō),你只是運(yùn)行 sudo -s),你將會(huì)得到一個(gè)有 root 權(quán)限的交互式的 shell。
4.請(qǐng)記住,-s 命令行參數(shù)給你一個(gè)有 root 權(quán)限的 shell,但那不是 root 環(huán)境 —— 還是執(zhí)行的你自己的 .bashrc。例如,在 sudo -s 運(yùn)行的新 shell 里,執(zhí)行 whoami 命令仍會(huì)返回你的用戶名,而非 root 。
-i 選項(xiàng)
-i 選項(xiàng)和 -s 選項(xiàng)相像。然而,還是有點(diǎn)區(qū)別。一個(gè)重要的區(qū)別是 -i 給你的是 root 環(huán)境,意味著原用戶的 .bashrc 被忽略。這就像沒(méi)有顯式地用 root 登錄也能成為 root 。此外,你也不用輸入 root 用戶密碼。
su、sudo su、sudo -i 的區(qū)別
補(bǔ)充…
查看日志文件
在 ubuntu 中,sudo 的日志默認(rèn)被記錄在 /var/log/auth.log 文件中。當(dāng)我們執(zhí)行 sudo 命令時(shí),相關(guān)日志都是會(huì)被記錄下來(lái)的。比如下圖中顯示的就是一次執(zhí)行 sudo 命令的日志:
在 CentOS 中查看日志 /vat/log/secure:
[root@localhost ~]# tail /var/log/secure Apr 5 13:55:58 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0) Apr 5 13:56:11 localhost su: pam_unix(su-l:session): session closed for user tom Apr 5 13:56:17 localhost passwd: pam_unix(passwd:chauthtok): password changed for tom Apr 5 13:56:17 localhost passwd: gkr-pam: couldn't update the 'login' keyring password: no old password was entered Apr 5 13:56:23 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0) Apr 5 13:56:43 localhost sudo: tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=list ##tom以管理員身份執(zhí)行了list命令 Apr 5 14:00:50 localhost sudo: tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=/usr/sbin/useradd test1 ##tom以管理員身份執(zhí)行了useradd命令,添加用戶test1 Apr 5 14:00:50 localhost useradd[2128]: new group: name=test1, GID=501 Apr 5 14:00:50 localhost useradd[2128]: new user: name=test1, UID=501, GID=501, home=/home/test1, shell=/bin/bash Apr 5 14:07:15 localhost su: pam_unix(su-l:session): session closed for user tom以后可以查看日志文件分析主機(jī)是否遭到入侵攻擊,或者查看某用戶登錄進(jìn)來(lái)并使用特殊權(quán)限執(zhí)行了哪些指令等。所以我們要實(shí)時(shí)監(jiān)控此文件的動(dòng)向。
參考示例
以用戶 mysql 的身份執(zhí)行命令 pwd
當(dāng)前登錄用戶是 root,我要以 mysql 的身份執(zhí)行命令 pwd,命令如下:
[root@htlwk0001host ~]# sudo -u mysql pwd /root以用戶 root 的身份執(zhí)行命令 pwd
當(dāng)前登錄用戶是 mysql,我要以 root 的身份執(zhí)行命令 pwd,命令語(yǔ)句如下:
[mysql@htlwk0001host root]$ sudo pwd [sudo] mysql 的密碼: mysql 不在 sudoers 文件中。此事將被報(bào)告。注:
1.sudo 沒(méi)有使用選項(xiàng) -u 來(lái)指定其它用戶,默認(rèn)是 root 用戶
2.從上面輸出結(jié)果可以知道,使用命令 sudo,需要輸入當(dāng)前登錄用戶自己的密碼
3.當(dāng)前登錄用戶沒(méi)有在 /etc/sudoers 文件中,所以不能使用命令 sudo
這個(gè)命令相當(dāng)于使用 root 超級(jí)用戶重新登錄一次 shell,只不過(guò)密碼是當(dāng)前登錄用戶的密碼。而且重要是,該命令會(huì)重新加載 /etc/profile 文件以及 /etc/bashrc 文件等系統(tǒng)配置文件,并且還會(huì)重新加載 root 用戶的 $SHELL 環(huán)境變量所對(duì)應(yīng)的配置文件 ,比如:root 超級(jí)用戶的$SHELL 是 /bin/bash,則會(huì)加載 /root/.bashrc 等配置。如果是 /bin/zsh,則會(huì)加載 /root/.zshrc 等配置,執(zhí)行后是完全的 root 環(huán)境。
以 root 的權(quán)限執(zhí)行上一條命令
如果由于你忘了使用 sudo 而導(dǎo)致命令行返回一個(gè)錯(cuò)誤,只需輸入 sudo !! 就可以用 sudo 來(lái)執(zhí)行上一條指令:
[mysql@htlwk0001host ~]$ sudo !!以 root 的權(quán)限編輯指定的文件
[root@htlwk0001host mysql]# sudo -e /root/student.txt使用命令 sudo,如果沒(méi)有使用選項(xiàng) -u 指定用戶,默認(rèn)是 root 用戶。這條命令等效下面這條指令:
[root@htlwk0001host mysql]# sudoedit /root/student.txt普通用戶切換成 root 身份
當(dāng)前登錄用戶是 mysql,想切換成用戶 root,可以執(zhí)行下面的命令:
[mysql@htlwk0001host ~]$ sudo -i [sudo] mysql 的密碼:注:
1.這里是輸入用戶 mysql 自己的登錄密碼。
2.必須在文件 /etc/sudoers 中配置用戶 mysql 有關(guān) sudo 的權(quán)限(即授權(quán)),用戶 mysql 才能使用命令 sudo。
3.選項(xiàng) -i,表示以目標(biāo)用戶 root 登錄 shell,這樣切換成用戶 root 后,相關(guān)的運(yùn)行環(huán)境也改變成用戶 root 的運(yùn)行環(huán)境,感覺(jué)好像就是以用戶 root 登錄 shell 一樣,其實(shí)還是有區(qū)別的,具體需要參閱手冊(cè)。
也可以使用命令 su 切換成 root 用戶:
[mysql@htlwk0001host ~]$ su root 密碼:這里需要輸入用戶 root 的登錄密碼。
使用 root 的身份執(zhí)行最近一條指令
如果由于你忘了使用 sudo 而導(dǎo)致命令行返回一個(gè)錯(cuò)誤,只需輸入 sudo !! 就可以用 sudo 來(lái)執(zhí)行上一條指令。
使用 sudo 切換 Shell 類型
如果你需要執(zhí)行很多條需要 root 權(quán)限的命令,你可以臨時(shí)切換整個(gè)命令行 shell 來(lái)取得 root 級(jí)別的訪問(wèn)權(quán)限。方法就是先輸入sudo -s,回車后再鍵入你的密碼。
感覺(jué) -s 選項(xiàng)有點(diǎn)類似 -i 選項(xiàng),都可以切換指定用戶身份。
切換成指定的用戶
[root@htlwk0001host ~]# sudo -u mysql -i [mysql@htlwk0001host ~]$或者
[root@htlwk0001host ~]# sudo -u mysql -s [mysql@htlwk0001host root]$感覺(jué) -s 選項(xiàng)有點(diǎn)類似 -i 選項(xiàng),都可以切換成指定的用戶身份。但是兩者肯定有區(qū)別,我沒(méi)有研究出本質(zhì)的區(qū)別,目前可以知道的就是使用選項(xiàng) -i 切換后當(dāng)前工作目錄會(huì)改成目標(biāo)用戶的家目錄,而選項(xiàng) -s 則沒(méi)有改變,但是這點(diǎn)并不是很重要,我查看了兩種選項(xiàng)切換后的環(huán)境變量,也都改成了目標(biāo)用戶的環(huán)境變量。
重要:請(qǐng)注意 su 命令也能讓你切換用戶(默認(rèn)切換到 root )。這個(gè)命令需要你輸入 root 密碼。為了避免這一點(diǎn),你可以使用 sudo 執(zhí)行它
[mysql@htlwk0001host root]$ sudo su [sudo] mysql 的密碼: [root@htlwk0001host ~]#這樣你只需要輸入你的登錄密碼。
顯示當(dāng)前用戶可以用 sudo 執(zhí)行哪些命令
[lamp@localhost ~]$ sudo -l [sudo] password for lamp: # 需要輸入lamp用戶的密碼 User lamp may run the following commands on this host: (root) /sbin/shutdown -r now可以看到,lamp 用戶擁有了 shutdown -r now 的權(quán)限。這時(shí),lamp 用戶就可以使用 sudo 執(zhí)行如下命令重啟服務(wù)器:
[lamp@localhost ~]$ sudo /sbin/shutdown -r now通過(guò)加入群組的方式給普通用戶授權(quán)
ubuntu 系統(tǒng)默認(rèn)創(chuàng)建了一個(gè)名為 sudo 的組。只要把用戶加入這個(gè)組,用戶就具有了 sudo 的權(quán)限。
至于如何把用戶加入 sudo 組,您可以直接編輯 /etc/group 文件,當(dāng)然您得使用一個(gè)有 sudo 權(quán)限的用戶來(lái)干這件事:
在 sudo 組中加入新的用戶,要使用逗號(hào)分隔多個(gè)用戶:
sudo:x:27:nick,jack或者您可以使用 usermod 命令把用戶 jack 添加到一個(gè) sudo 用戶組中:
$ sudo usermod -a -G sudo jack上面的設(shè)置中我們把用戶 jack 添加到了 sudo 組中,所以當(dāng)用戶 jack 登錄后就可以通過(guò) sudo 命令以 root 權(quán)限執(zhí)行命令了!
總結(jié)
以上是生活随笔為你收集整理的Linux 命令之 sudo -- 以其他用户身份来执行命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 上坟摆什么水果吉利(上供最好的五种水果,
- 下一篇: Linux 命令之 who -- 打印当