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

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

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

之前一直對 su 和 sudo 這兩個命令犯迷糊,最近專門搜了這方面的資料,總算是把兩者的關(guān)系以及用法搞清楚了,這篇文章來系統(tǒng)總結(jié)一下。

1. 準備工作

因為本篇博客中涉及到用戶切換,所以需要提前準備好幾個測試用戶,方便后續(xù)切換。

Linux中新建用戶的命令是 useradd ,一般系統(tǒng)中這個命令對應(yīng)的路徑都在 PATH 環(huán)境變量里,如果直接輸入 useradd 不管用的話,就用絕對路徑名的方式: /usr/sbin/useradd 。

useradd 新建用戶命令只有 root 用戶才能執(zhí)行,先從普通用戶ubuntu切換到root用戶(如何切換后文會介紹):

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 目錄下面有兩個用戶了

因為還沒有給新建的用戶 test_user 設(shè)置登錄密碼,這就導致無法從普通用戶ubuntu切換到test_user,所以接下來,需要用root來設(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 ,說明現(xiàn)在的身份是 ubuntu 用戶。

2. su 命令介紹及主要用法

首先需要解釋下 su 代表什么意思。

之前一直以為 su 是 super user ,查閱資料之后才知道原來表示 switch user 。

知道 su 是由什么縮寫來的之后,那么它提供的功能就顯而易見了,就是 切換用戶 。

2.1 - 參數(shù)

su 的一般使用方法是:

su  <user_name>

或者

su - <user_name>

兩種方法只差了一個字符 - ,會有比較大的差異:

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

光解釋會比較抽象,我們看一個例子就比較容易理解了。

首先從ubuntu用戶以 non-login-shell 的方式切換到root用戶,比較兩種用戶狀態(tài)下環(huán)境變量中 PWD 的值( su 命令不跟任何 <user_name> ,默認切換到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)臺下環(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é):具體使用哪種方式切換用戶看個人需求:

non-login-shell
login-shell

2.2 切換到指定用戶

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

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

因為在 1. 準備工作 部分已經(jīng)新建了一個test_user用戶,并且我們也知道test_user用戶的登錄密碼(root 用戶設(shè)置的),就能從ubuntu用戶切換到test_user用戶:

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

2.3 -c 參數(shù)

前面的方法中,都是先切換到另一個用戶(root 或者 test_user),在哪個用戶的狀態(tài)下執(zhí)行命令,最后輸入 exit 返回當前ubuntu用戶。

還有一種方式是:不需要先切換用戶再執(zhí)行命令,可以直接在當前用戶下,以另一個用戶的方式執(zhí)行命令,執(zhí)行結(jié)束后就返回當前用戶。這就得用到 -c 參數(shù)。

具體使用方法是:

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

看個例子:

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 很像,都是臨時申請一下root用戶的權(quán)限。但還是有差異,接著往后看。

3. sudo 命令介紹及主要用法

首先還是解釋下 sudo 命令是什么意思。

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

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

3.1 主要用法

在 Linux 中經(jīng)常會碰到 Permission denied 這種情況,比如以 ubuntu 用戶的身份查看 /etc/shadow 的內(nèi)容。因為這個文件的內(nèi)容是只有root用戶能查看的。

那如果想要查看怎么辦呢?這時候就可以使用 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 !!                                    # 跟兩個驚嘆號  
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:~$

實例中,我們使用了 sudo !! 這個小技巧,表示重復上面輸入的命令,只不過在命令最前面加上 sudo 。

因為我已經(jīng)設(shè)置了 sudo 命令不需要輸入密碼,所以這里 sudo !! 就能直接輸出內(nèi)容。如果沒有設(shè)置的話,需要輸入當前這個用戶的密碼,例如本例中,就應(yīng)該輸入ubuntu用戶的登錄密碼。

兩次相鄰的 sudo 操作,如果間隔在 5min 之內(nèi),第二次輸入 sudo 不需要重新輸入密碼;如果超過 5min ,那么再輸入 sudo 時,又需要輸入密碼。所以一個比較省事的方法是設(shè)置 sudo 操作不需要密碼。后面介紹如何設(shè)置。

sudo 除了以root用戶的權(quán)限執(zhí)行命令外,還有其它幾個用法,這里做簡單介紹。

切換到 root 用戶:

sudo su -

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

sudo su -
su -

還有一個命令:

sudo -i

這個命令和 sudo su - 效果一致,也是切換到 root 用戶,也是需要提供當前用戶(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.  
$

會看到倒數(shù)第二行中的錯誤提示信息,無法查看 /etc/shadow 的內(nèi)容,這是為什么?為什么ubuntu可以使用 sudo 但是test_user不行呢?

這就涉及到 sudo 的工作原理了。

3.2 sudo 工作原理

一個用戶能否使用 sudo 命令,取決于 /etc/sudoers 文件的設(shè)置。

從 3.1 節(jié)中已經(jīng)看到,ubuntu用戶可以正常使用 sudo ,但是test_user用戶卻無法使用,這是因為 /etc/sudoers 文件里沒有配置 test_user。

/etc/sudoers 也是一個文本文件,但是因其有特定的語法,不要直接用 vim 或者 vi 來編輯它,需要用 visudo 這個命令。輸入這個命令之后就能直接編輯 /etc/sudoers 這個文件了。

需要說明的是,只有 root 用戶有權(quán)限使用 visudo 命令。

先來看下輸入 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

解釋下每一行的格式:

  • 第一個表示用戶名,如 root 、 ubuntu 等;
  • 接下來等號左邊的 ALL 表示允許從任何主機登錄當前的用戶賬戶;
  • 等號右邊的 ALL 表示:這一行行首對一個的用戶可以切換到系統(tǒng)中任何一個其它用戶;
  • 行尾的 ALL 表示:當前行首的用戶,能以 root 用戶的身份下達什么命令, ALL 表示可以下達任何命令。

還注意到 ubuntu 對應(yīng)的那一行有個 NOPASSWD 關(guān)鍵字,這就是表明 ubuntu 這個用戶在請求 sudo 時不需要輸入密碼,到這里就解釋了前面的問題。

同時要注意到,這個文件里并沒有 test_user 對應(yīng)的行,這也就解釋了為什么test_user無法使用 sudo 命令。

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

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

接下來再在 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)看到了,如果一個用戶在 /etc/sudoers 文件中,那么它就具有 sudo 權(quán)限,就能通過 sudo su - 或者 sudo -i 等命令切換到root用戶了,那這時這個用戶就變成root用戶了,那這不對系統(tǒng)造成很大的威脅嗎?

實際上的確是這樣的。所以如果在編輯 /etc/sudoers 文件賦予某種用戶 sudo 權(quán)限時,必須要確定該用戶是 可信任 的,不會對系統(tǒng)造成惡意破壞,否則將所有root權(quán)限都賦予該用戶將會有非常大的危險。

當然,root用戶也可以編輯 /etc/sudoers 使用戶只具備一部分權(quán)限,即只能執(zhí)行一小部分命令。有興趣的讀者可以參考 Reference 部分第二條,這篇文章不再贅述。

4. 二者的差異對比

二者的差異對比:

su -
sudo su -

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

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

相關(guān)文章

  • 25個好用的Shell腳本常用命令分享

    25個好用的Shell腳本常用命令分享

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

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

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

    Linux 下vim使用教程

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

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

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

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

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

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

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

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

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

    Shell中的數(shù)學運算使用

    這篇文章主要介紹了Shell中的數(shù)學運算使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    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中單引號和雙引號的區(qū)別小結(jié)

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

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

最新評論

定边县| 卓资县| 喀喇| 中江县| 威信县| 靖宇县| 台北县| 于都县| 桃园市| 龙门县| 武鸣县| 洪雅县| 龙游县| 华阴市| 四平市| 阳春市| 土默特左旗| 南汇区| 大关县| 邢台市| 新干县| 黄平县| 安达市| 荆州市| 宾川县| 廊坊市| 沁水县| 内丘县| 莱芜市| 沧州市| 英德市| 广河县| 泾川县| 秦安县| 临邑县| 栾城县| 娄烦县| 靖江市| 日土县| 得荣县| 延安市|