最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

面試必問(wèn)Linux?命令su和sudo的區(qū)別解析

 更新時(shí)間:2022年07月26日 08:58:01   作者:程序新視界  
之前一直對(duì)?su?和?sudo?這兩個(gè)命令犯迷糊,最近專門搜了這方面的資料,總算是把兩者的關(guān)系以及用法搞清楚了,這篇文章來(lái)系統(tǒng)總結(jié)一下,對(duì)Linux?命令su和sudo相關(guān)知識(shí)感興趣的朋友一起看看吧

之前一直對(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 -m test_user # 帶上 -m 參數(shù)  
root@VM-0-14-ubuntu:~# ls /home  
test_user  ubuntu  # 可以看到 /home 目錄下面有兩個(gè)用戶了

因?yàn)檫€沒有給新建的用戶 test_user 設(shè)置登錄密碼,這就導(dǎo)致無(wú)法從普通用戶ubuntu切換到test_user,所以接下來(lái),需要用root來(lái)設(shè)置test_user的登錄密碼。需要用到 passwd 命令:

root@VM-0-14-ubuntu:~# passwd test_user  
Enter new UNIX password:  # 輸出 test_user 的密碼  
Retype new UNIX password:         
passwd: password updated successfully  
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)的之后,那么它提供的功能就顯而易見了,就是 切換用戶 。

2.1 - 參數(shù)

su 的一般使用方法是:

su  <user_name>

或者

su - <user_name>

兩種方法只差了一個(gè)字符 - ,會(huì)有比較大的差異:

  • 如果加入了 - 參數(shù),那么是一種 login-shell 的方式,意思是說(shuō)切換到另一個(gè)用戶 <user_name> 之后,當(dāng)前的shell會(huì)加載 <user_name> 對(duì)應(yīng)的環(huán)境變量和各種設(shè)置;
  • 如果沒有加入 - 參數(shù),那么是一種 non-login-shell 的方式,意思是說(shuō)現(xiàn)在切換到了 <user_name> ,但是當(dāng)前的shell還是加載切換之前的那個(gè)用戶的環(huán)境變量以及各種設(shè)置。

光解釋會(huì)比較抽象,我們看一個(gè)例子就比較容易理解了。

首先從ubuntu用戶以 non-login-shell 的方式切換到root用戶,比較兩種用戶狀態(tài)下環(huán)境變量中 PWD 的值( su 命令不跟任何 <user_name> ,默認(rèn)切換到root用戶):

ubuntu@VM-0-14-ubuntu:~$ env | grep ubuntu  
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)境變量。

接著從ubuntu用戶以 login-shell 的方式切換到root用戶,同樣比較兩種用戶轉(zhuǎn)臺(tái)下環(huán)境變量中 PWD 的值:

ubuntu@VM-0-14-ubuntu:~$ env | grep ubuntu  
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)境變量也跟著改變了。

總結(jié):具體使用哪種方式切換用戶看個(gè)人需求:

non-login-shell
login-shell

2.2 切換到指定用戶

前面已經(jīng)介紹了,如果 su 命令后面不跟任何 <user_name>,那么默認(rèn)是切換到 root 用戶:

ubuntu@VM-0-14-ubuntu:~$ su -  
Password:  # root 用戶的密碼  
root@VM-0-14-ubuntu:/home/ubuntu#

因?yàn)樵?nbsp;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ù)。

具體使用方法是:

su - -c "指令串"  # 以 root 的方式執(zhí)行 "指令串"

看個(gè)例子:

ubuntu@VM-0-14-ubuntu:~$ cat /etc/shadow  
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 命令是什么意思。

sudo 的英文全稱是 super user do ,即以超級(jí)用戶(root 用戶)的方式執(zhí)行命令。這里的 sudo 和之前 su 表示的 switch user 是不同的,這點(diǎn)需要注意,很容易搞混。

先介紹 sudo 命令能做什么事情,然后說(shuō)明為何能做到這些,以及如何做到這些。

3.1 主要用法

在 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 -n 3 /etc/shadow  
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ù)上面輸入的命令,只不過(guò)在命令最前面加上 sudo 。

因?yàn)槲乙呀?jīng)設(shè)置了 sudo 命令不需要輸入密碼,所以這里 sudo !! 就能直接輸出內(nè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 用戶:

sudo su -

這種方式也能以 login-shell 的方式切換到 root 用戶,但是它和 su - 方法是由區(qū)別的:

sudo su -
su -

還有一個(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 的密碼  
$ 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ò)誤提示信息,無(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)?nbsp;/etc/sudoers 文件里沒有配置 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

輸出:

# User privilege specification  
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 等;
  • 接下來(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è)文件里并沒有 test_user 對(duì)應(yīng)的行,這也就解釋了為什么test_user無(wú)法使用 sudo 命令。

接下來(lái),嘗試將test_user添加到 /etc/sudoers 文件中,使test_user也能使用 sudo 命令。在最后一行添加:

test_user  ALL=(ALL:ALL)  ALL   # test_user 使用 sudo 需要提供 test_user 的密碼

接下來(lái)再在 test_user 賬戶下執(zhí)行 sudo :

ubuntu@VM-0-14-ubuntu:~$ su - test_user  
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)限,就能通過(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ì)比

二者的差異對(duì)比:

su -
sudo su -

兩種方式的差異也顯而易見:如果我們的Linux系統(tǒng)有很多用戶需要使用的話,前者要求所有用戶都知道root用戶的密碼,這顯然是非常危險(xiǎn)的;后者是不需要暴露root賬戶密碼的,用戶只需要輸入自己的賬戶密碼就可以,而且哪些用戶可以切換到root,這完全是受root控制的(root通過(guò)設(shè)置 /etc/sudoers 實(shí)現(xiàn)的),這樣系統(tǒng)就安全很多了。

到此這篇關(guān)于面試必問(wèn)Linux 命令su和sudo的區(qū)別解析的文章就介紹到這了,更多相關(guān)Linux 命令su和sudo內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 25個(gè)好用的Shell腳本常用命令分享

    25個(gè)好用的Shell腳本常用命令分享

    這篇文章主要介紹了25個(gè)好用的Shell腳本常用命令,由個(gè)人收集整理而來(lái),需要的朋友可以參考下
    2014-03-03
  • Shell腳本調(diào)用另一個(gè)腳本的三種方法

    Shell腳本調(diào)用另一個(gè)腳本的三種方法

    這篇文章主要介紹了Shell腳本調(diào)用另一個(gè)腳本的三種方法,幫助大家更好的理解和學(xué)習(xí)shell,感興趣的朋友可以了解下
    2020-08-08
  • Linux 下vim使用教程

    Linux 下vim使用教程

    Vim是從 vi 發(fā)展出來(lái)的一個(gè)文本編輯器。這篇文章給大家介紹Linux 下vim使用教程,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-07-07
  • Shell中實(shí)現(xiàn)“多線程”執(zhí)行腳本文件完美解決方案

    Shell中實(shí)現(xiàn)“多線程”執(zhí)行腳本文件完美解決方案

    這篇文章主要介紹了Shell中實(shí)現(xiàn)“多線程”執(zhí)行腳本文件完美解決方案,本文是針對(duì)一次調(diào)用執(zhí)行多個(gè)腳本文件并分批執(zhí)行的一個(gè)解決方法的測(cè)試和總結(jié),需要的朋友可以參考下
    2014-12-12
  • Linux中實(shí)現(xiàn)非登錄系統(tǒng)用戶執(zhí)行命令的方法

    Linux中實(shí)現(xiàn)非登錄系統(tǒng)用戶執(zhí)行命令的方法

    Linux系統(tǒng)中,管理員經(jīng)常需要通過(guò)一個(gè)無(wú)法登錄shell的系統(tǒng)用戶來(lái)執(zhí)行特定的命令,這種需求在管理多用戶系統(tǒng)或自動(dòng)化任務(wù)時(shí)尤為常見,下面,我們將詳細(xì)講解如何實(shí)現(xiàn)這一需求,并深入分析其背后的原理,需要的朋友可以參考下
    2024-01-01
  • Shell腳本編程30分鐘入門(小結(jié))

    Shell腳本編程30分鐘入門(小結(jié))

    這篇文章主要介紹了Shell腳本編程30分鐘入門(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • shell腳本自動(dòng)輸入用戶名和密碼的實(shí)現(xiàn)

    shell腳本自動(dòng)輸入用戶名和密碼的實(shí)現(xiàn)

    本文主要介紹了shell腳本自動(dòng)輸入用戶名和密碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Shell中的數(shù)學(xué)運(yùn)算使用

    Shell中的數(shù)學(xué)運(yùn)算使用

    這篇文章主要介紹了Shell中的數(shù)學(xué)運(yùn)算使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No such file or directory

    bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpret

    這篇文章主要介紹了bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No such file or directory,需要的朋友可以參考下
    2014-10-10
  • Bash?Shell中單引號(hào)和雙引號(hào)的區(qū)別小結(jié)

    Bash?Shell中單引號(hào)和雙引號(hào)的區(qū)別小結(jié)

    在Bash中,單引號(hào)和雙引號(hào)都能定義字符串,但它們處理變量擴(kuò)展、特殊字符的方式不同,本文就來(lái)介紹一下Bash?Shell中單引號(hào)和雙引號(hào)的區(qū)別小結(jié),感興趣的可以了解一下
    2024-11-11

最新評(píng)論

乐安县| 闽清县| 潜山县| 吉安县| 诸城市| 峨边| 当阳市| 农安县| 盐津县| 玉山县| 台中县| 清丰县| 云南省| 扎赉特旗| 墨竹工卡县| 云浮市| 双流县| 丹阳市| 盐城市| 商城县| 聊城市| 阿拉善盟| 木兰县| 彰武县| 贵南县| 浪卡子县| 襄城县| 五大连池市| 密山市| 拜泉县| 柯坪县| 桐柏县| 东丽区| 黔西县| 揭东县| 深水埗区| 白城市| 铜鼓县| 高雄市| 利津县| 和平区|