Linux 命令 su 和 sudo 的區(qū)別
時(shí)間:2021-12-07 14:10:44
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容作者:JunTao之前一直對(duì)su和sudo這兩個(gè)命令犯迷糊,最近專門搜了這方面的資料,總算是把兩者的關(guān)系以及用法搞清楚了,這篇文章來系統(tǒng)總結(jié)一下。1.準(zhǔn)備工作因?yàn)楸酒┛椭猩婕暗接脩羟袚Q,所以我需要提前準(zhǔn)備好幾個(gè)測(cè)試用戶,方便后續(xù)切換。Linux中新...
1. 準(zhǔn)備工作
因?yàn)楸酒┛椭猩婕暗接脩羟袚Q,所以我需要提前準(zhǔn)備好幾個(gè)測(cè)試用戶,方便后續(xù)切換。
Password: # 輸入 root 用戶登錄密碼
root@VM-0-14-ubuntu:~# useradd -m test_user # 帶上 -m 參數(shù)
root@VM-0-14-ubuntu:~# ls /home
test_user ubuntu # 可以看到 /home 目錄下面有兩個(gè)用戶了
因?yàn)檫€沒有給新建的用戶 test_user 設(shè)置登錄密碼,這就導(dǎo)致我們無法從普通用戶 ubuntu 切換到 test_user,所以接下來,我們需要用 root 來設(shè)置 test_user 的登錄密碼。需要用到 passwd 命令:
Enter new UNIX password: # 輸出 test_user 的密碼
Retype new UNIX password:
passwd: password updated successfully
root@VM-0-14-ubuntu:~#
接著我們輸入 exit 退出 root 用戶到 普通用戶 ubuntu:
logout
ubuntu@VM-0-14-ubuntu:~$
可以看到,命令提示符前面已經(jīng)由 root 變成 ubuntu,說明我們現(xiàn)在的身份是 ubuntu 用戶。
2. su 命令介紹及主要用法
首先需要解釋下 su 代表什么意思。
2.1 - 參數(shù)
su 的一般使用方法是:
或者
兩種方法只差了一個(gè)字符 -,會(huì)有比較大的差異:
- 如果加入了 - 參數(shù),那么是一種 login-shell 的方式,意思是說切換到另一個(gè)用戶之后,當(dāng)前的 shell 會(huì)加載對(duì)應(yīng)的環(huán)境變量和各種設(shè)置;
- 如果沒有加入 - 參數(shù),那么是一種 non-login-shell 的方式,意思是說我現(xiàn)在切換到了,但是當(dāng)前的 shell 還是加載切換之前的那個(gè)用戶的環(huán)境變量以及各種設(shè)置。
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 | grep ubuntu
PWD=/home/ubuntu # 可以發(fā)現(xiàn)還是 /home/ubuntu
root@VM-0-14-ubuntu:/home/ubuntu#
我們的確是切換到 root 用戶了,但是 shell 環(huán)境中的變量并沒有改變,還是用之前 ubuntu 用戶的環(huán)境變量。
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 | grep root
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)境變量也跟著改變了。
-
如果不想因?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 用戶:
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 用戶:
Password: # test_user 用戶的密碼
$
2.3 -c 參數(shù)
前面的方法中,我們都是先切換到另一個(gè)用戶(root 或者 test_user),在哪個(gè)用戶的狀態(tài)下執(zhí)行命令,最后輸入 exit 返回當(dāng)前 ubuntu 用戶。
我么看個(gè)例子:
cat: /etc/shadow: Permission denied # ubuntu 用戶不能直接查看 /etc/shadow 文件內(nèi)容
ubuntu@VM-0-14-ubuntu:~$ su - -c "tail -n 4 /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 命令是什么意思。
3.1 主要用法
我們?cè)?Linux 中經(jīng)常會(huì)碰到 Permission denied 這種情況,比如以 ubuntu 用戶的身份查看 /etc/shadow 的內(nèi)容。因?yàn)檫@個(gè)文件的內(nèi)容是只有 root 用戶能查看的。
tail: cannot open '/etc/shadow' for reading: Permission denied # 沒有權(quán)限
ubuntu@VM-0-14-ubuntu:~$ sudo !! # 跟兩個(gè)驚嘆號(hào)
sudo tail -n 3 /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ù)上面輸入的命令,只不過在命令最前面加上 sudo 。
這種方式也能以 login-shell 的方式切換到 root 用戶,但是它和 su - 方法是有區(qū)別的:
-
前者輸入 sudo su - 后,需要提供當(dāng)前用戶的登錄密碼,也就是 ubuntu 用戶的密碼;
-
后者輸入 su - 后,需要提供 root 用戶的登錄密碼。
這個(gè)命令和 sudo su - 效果一致,也是切換到 root 用戶,也是需要提供當(dāng)前用戶(ubuntu 用戶)的登錄密碼。
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.
$
我們會(huì)看到倒數(shù)第二行中的錯(cuò)誤提示信息,我們無法查看 /etc/shadow 的內(nèi)容,這是為什么?為什么 ubuntu 可以使用 sudo 但是 test_user 不行呢?
3.2 sudo 工作原理
一個(gè)用戶能否使用 sudo 命令,取決于 /etc/sudoers 文件的設(shè)置。
輸出:
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
解釋下每一行的格式:
-
第一個(gè)表示用戶名,如 root 、ubuntu 等;
-
接下來等號(hào)左邊的 ALL 表示允許從任何主機(jī)登錄當(dāng)前的用戶賬戶;
-
等號(hào)右邊的 ALL 表示:這一行行首對(duì)一個(gè)的用戶可以切換到系統(tǒng)中任何一個(gè)其它用戶;
-
行尾的 ALL 表示:當(dāng)前行首的用戶,能以 root 用戶的身份下達(dá)什么命令,ALL 表示可以下達(dá)任何命令。
接下來我們?cè)僭?test_user 賬戶下執(zhí)行 sudo :
Password:
$ tail -n 3 /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
$ sudo tail -n 3 /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)限,就能通過 sudo su - 或者 sudo -i 等命令切換到 root 用戶了,那這時(shí)這個(gè)用戶就變成 root 用戶了,那這不對(duì)系統(tǒng)造成很大的威脅嗎?
4. 二者的差異對(duì)比
我們已經(jīng)看到:
-
使用 su - ,提供 root 賬戶的密碼,可以切換到 root 用戶;
-
使用 sudo su - ,提供當(dāng)前用戶的密碼,也可以切換到 root 用戶
來源:Jun Tao???????????????? END ????????????????
地址:https://tanjuntao.github.io/