有所為,有所不為:在Linux中使用超級(jí)用戶(hù)權(quán)限
sudo 命令允許特權(quán)用戶(hù)以 root 用戶(hù)身份運(yùn)行全部或部分命令,但是理解其能做什么和不能做什么很有幫助。
在你想要使用超級(jí)權(quán)限臨時(shí)運(yùn)行一條命令時(shí),sudo
命令非常方便,但是當(dāng)它不能如你期望的工作時(shí),你也會(huì)遇到一些麻煩。比如說(shuō)你想在某些日志文件結(jié)尾添加一些重要的信息,你可能會(huì)嘗試這樣做:
$ echo "Important note" >> /var/log/somelog
-bash: /var/log/somelog: Permission denied
好吧,看起來(lái)你似乎需要一些額外的特權(quán)。一般來(lái)說(shuō),你不能使用你的用戶(hù)賬號(hào)向系統(tǒng)日志中寫(xiě)入東西。我們使用 sudo
再?lài)L試一次吧。
$ sudo !!
sudo echo "Important note" >> /var/log/somelog
-bash: /var/log/somelog: Permission denied
嗯,它還是沒(méi)有啥反應(yīng)。我們來(lái)試點(diǎn)不同的吧。
$ sudo 'echo "Important note" >> /var/log/somelog'
sudo: echo "Important note" >> /var/log/somelog: command not found
也可以查看:在 Linux 下排查故障的寶貴提示和技巧。
接下來(lái)該干什么?
上面在執(zhí)行完***條命令后的回應(yīng)顯示,我們?nèi)鄙傧蛉罩疚募?xiě)入時(shí)必須的特權(quán)。第二次,我們使用 root 權(quán)限運(yùn)行了***次的命令,但是返回了一個(gè)“沒(méi)有權(quán)限”的錯(cuò)誤。第三次,我們把整個(gè)命令放在一個(gè)引號(hào)里面再運(yùn)行了一遍,返回了一個(gè)“沒(méi)有發(fā)現(xiàn)命令”的錯(cuò)誤。所以,到底錯(cuò)在哪里了呢?
- ***條命令:沒(méi)有 root 特權(quán),你無(wú)法向這個(gè)日志中寫(xiě)入東西。
- 第二條命令:你的超級(jí)權(quán)限沒(méi)有延伸到重定向。
- 第三條命令:
sudo
不理解你用引號(hào)括起來(lái)的整個(gè) “命令”。
而且如果你的用戶(hù)還未添加到 sudo 用戶(hù)組的時(shí)候,如果嘗試使用 sudo
,你可能已經(jīng)看到過(guò)像下面的這么一條錯(cuò)誤了:
nemo is not in the sudoers file. This incident will be reported.
你可以做什么?
一個(gè)相當(dāng)簡(jiǎn)單的選擇就是使用 sudo
命令暫時(shí)成為 root。鑒于你已經(jīng)有了 sudo 特權(quán),你可以使用下面的命令執(zhí)行此操作:
$ sudo su
[sudo] password for nemo:
#
注意這個(gè)改變的提示符表明了你的新身份。然后你就可以以 root 運(yùn)行之前的命令了:
# echo "Important note" >> /var/log/somelog
接著你可以輸入 ^d
返回你之前的身份。當(dāng)然了,一些 sudo 的配置可能會(huì)阻止你使用 sudo
命令成為 root。
另一個(gè)切換用戶(hù)為 root 的方法是僅用 su
命令,但是這需要你知道 root 密碼。許多人被賦予了訪(fǎng)問(wèn) sudo 的權(quán)限,而并不知道 root 密碼,所以這并不是總是可行。
(采用 su 直接)切換到 root 之后,你就可以以 root 的身份運(yùn)行任何你想執(zhí)行的命令了。這種方式的問(wèn)題是:1) 每個(gè)想要使用 root 特權(quán)的人都需要事先知道 root 的密碼(這樣不很安全);2) 如果在運(yùn)行需要 root 權(quán)限的特定命令后未能退出特權(quán)狀態(tài),你的系統(tǒng)可能會(huì)受到一些重大錯(cuò)誤的波及。sudo
命令旨在允許您僅在真正需要時(shí)使用 root 權(quán)限,并控制每個(gè) sudo 用戶(hù)應(yīng)具有的 root 權(quán)限。它也可以使你在使用完 root 特權(quán)之后輕松地回到普通用戶(hù)的狀態(tài)。
另外請(qǐng)注意,整個(gè)討論的前提是你可以正常地訪(fǎng)問(wèn) sudo,并且你的訪(fǎng)問(wèn)權(quán)限沒(méi)有受限。詳細(xì)的內(nèi)容后面會(huì)介紹到。
還有一個(gè)選擇就是使用一個(gè)不同的命令。如果通過(guò)編輯文件從而在其后添加內(nèi)容是一種選擇的話(huà),你也許可以使用 sudo vi /var/log/somelog
,雖然編輯一個(gè)活躍的日志文件通常不是一個(gè)好主意,因?yàn)橄到y(tǒng)可能會(huì)頻繁的向這個(gè)文件中進(jìn)行寫(xiě)入操作。
***一個(gè)但是有點(diǎn)復(fù)雜的選擇是,使用下列命令之一可以解決我們之前看到的問(wèn)題,但是它們涉及到了很多復(fù)雜的語(yǔ)法。***個(gè)命令允許你在得到 “沒(méi)有權(quán)限” 的拒絕之后可以使用 !!
重復(fù)你的命令:
$ sudo echo "Important note" >> /var/log/somelog
-bash: /var/log/somelog: Permission denied
$ !!:gs/>/|sudo tee -a / <=====
$ tail -1 /var/log/somelog
Important note
第二種是通過(guò) sudo
命令,把你想要添加的信息傳遞給 tee
。注意,-a
指定了你要附加文本到目標(biāo)文件:
$ echo "Important note" | sudo tee -a /var/log/somelog
$ tail -1 /var/log/somelog
Important note
sudo 有多可控?
回答這個(gè)問(wèn)題最快速的回答就是,它取決于管理它的人。大多數(shù) Linux 的默認(rèn)設(shè)置都非常簡(jiǎn)單。如果一個(gè)用戶(hù)被安排到了一個(gè)特別的組中,例如 wheel
或者 admin
組,那這個(gè)用戶(hù)無(wú)需知道 root 的密碼就可以擁有運(yùn)行任何命令的能力。這就是大多數(shù) Linux 系統(tǒng)中的默認(rèn)設(shè)置。一旦在 /etc/group
中添加了一個(gè)用戶(hù)到了特權(quán)組中,這個(gè)用戶(hù)就可以以 root 的權(quán)力運(yùn)行任何命令。另一方面,可以配置 sudo,以便一些用戶(hù)只能夠以 root 身份運(yùn)行單一指令或者一組命令中的任何一個(gè)。
如果把像下面展示的這些行添加到了 /etc/sudoers
文件中,例如 “nemo” 這個(gè)用戶(hù)可以以 root 身份運(yùn)行 whoami
命令。在現(xiàn)實(shí)中,這可能不會(huì)造成任何影響,它非常適合作為一個(gè)例子。
# User alias specification
nemo ALL=(root) NOPASSWD: WHOAMI
# Cmnd alias specification
Cmnd_Alias WHOAMI = /usr/bin/whoami
注意,我們添加了一個(gè)命令別名(Cmnd_Alias
),它指定了一個(gè)可以運(yùn)行的命令的全路徑,以及一個(gè)用戶(hù)別名,允許這個(gè)用戶(hù)無(wú)需密碼就可以使用 sudo
執(zhí)行的單個(gè)命令。
當(dāng) nemo 運(yùn)行 sudo whoami
命令的時(shí)候,他將會(huì)看到這個(gè):
$ sudo whoami
root
注意這個(gè),因?yàn)?nemo 使用 sudo
執(zhí)行了這條命令,whoami
會(huì)顯示該命令運(yùn)行時(shí)的用戶(hù)是 root
。
至于其他的命令,nemo 將會(huì)看到像這樣的一些內(nèi)容:
$ sudo date
[sudo] password for nemo:
Sorry, user nemo is not allowed to execute '/bin/date' as root on butterfly.
sudo 的默認(rèn)設(shè)置
在默認(rèn)路徑中,我們會(huì)利用像下面展示的 /etc/sudoers
文件中的幾行:
$ sudo egrep "admin|sudo" /etc/sudoers
# 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 <=====
在這幾行中,%admin
和 %sudo
都說(shuō)明了任何添加到這些組中的人都可以使用 sudo
命令以 root 的身份運(yùn)行任何命令。
下面列出的是 /etc/group
中的一行,它意味著每一個(gè)在該組中列出的成員,都擁有了 sudo 特權(quán),而無(wú)需在 /etc/sudoers
中進(jìn)行任何修改。
sudo:x:27:shs,nemo
總結(jié)
sudo
命令意味著你可以根據(jù)需要輕松地部署超級(jí)用戶(hù)的訪(fǎng)問(wèn)權(quán)限,而且只有在需要的時(shí)候才能賦予用戶(hù)非常有限的特權(quán)訪(fǎng)問(wèn)權(quán)限。你可能會(huì)遇到一些與簡(jiǎn)單的 sudo command
不同的問(wèn)題,不過(guò)在 sudo
的回應(yīng)中應(yīng)該會(huì)顯示你遇到了什么問(wèn)題。