精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux中su和sudo命令有什么區別

Linux愛好者 ? 來源:博客 ? 作者:Jun Tao ? 2021-11-19 09:19 ? 次閱讀

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

1. 準備工作

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

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

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

ubuntu@VM-0-14-ubuntu:~$su-
Password:#輸入root用戶登錄密碼
root@VM-0-14-ubuntu:~#useradd-mtest_user#帶上-m參數
root@VM-0-14-ubuntu:~#ls/home
test_userubuntu#可以看到/home目錄下面有兩個用戶了

因為還沒有給新建的用戶 test_user 設置登錄密碼,這就導致我們無法從普通用戶 ubuntu 切換到 test_user,所以接下來,我們需要用 root 來設置 test_user 的登錄密碼。需要用到 passwd 命令:

root@VM-0-14-ubuntu:~#passwdtest_user
EnternewUNIXpassword:#輸出test_user的密碼
RetypenewUNIXpassword:
passwd:passwordupdatedsuccessfully
root@VM-0-14-ubuntu:~#

接著我們輸入 exit 退出 root 用戶到 普通用戶 ubuntu:

root@VM-0-14-ubuntu:~#exit
logout
ubuntu@VM-0-14-ubuntu:~$

可以看到,命令提示符前面已經由 root 變成 ubuntu,說明我們現在的身份是 ubuntu 用戶。

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

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

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

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

2.1 - 參數

su 的一般使用方法是:

su<user_name>

或者

su-<user_name>

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

  • 如果加入了-參數,那么是一種 login-shell 的方式,意思是說切換到另一個用戶 之后,當前的 shell 會加載 對應的環境變量和各種設置;
  • 如果沒有加入-參數,那么是一種 non-login-shell 的方式,意思是說我現在切換到了 ,但是當前的 shell 還是加載切換之前的那個用戶的環境變量以及各種設置。

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

我們首先從 ubuntu 用戶以 non-login-shell 的方式切換到 root 用戶,比較兩種用戶狀態下環境變量中 PWD 的值(su 命令不跟任何 ,默認切換到 root 用戶):

ubuntu@VM-0-14-ubuntu:~$env|grepubuntu
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|grepubuntu
PWD=/home/ubuntu#可以發現還是/home/ubuntu
root@VM-0-14-ubuntu:/home/ubuntu#

我們的確是切換到 root 用戶了,但是 shell 環境中的變量并沒有改變,還是用之前 ubuntu 用戶的環境變量。

接著我們從 ubuntu 用戶以 login-shell 的方式切換到 root 用戶,同樣比較兩種用戶轉臺下環境變量中 PWD 的值:

ubuntu@VM-0-14-ubuntu:~$env|grepubuntu
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|greproot
USER=root
PWD=/root#已經變成/root了
HOME=/root
MAIL=/var/mail/root
LOGNAME=root
root@VM-0-14-ubuntu:~#

可以看到用 login-shell 的方式切換用戶的話,shell 中的環境變量也跟著改變了。

總結:具體使用哪種方式切換用戶看個人需求:

  • 如果不想因為切換到另一個用戶導致自己在當前用戶下的設置不可用,那么用 non-login-shell 的方式;

  • 如果切換用戶后,需要用到該用戶的各種環境變量(不同用戶的環境變量設置一般是不同的),那么使用 login-shell 的方式。

2.2 切換到指定用戶

前面已經介紹了,如果 su 命令后面不跟任何,那么默認是切換到 root 用戶:

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

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

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

2.3 -c 參數

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

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

另外,Linux 系列面試題和答案全部整理好了,微信搜索Java技術棧,在后臺發送:面試,可以在線閱讀。

具體使用方法是:

su--c"指令串"#以root的方式執行"指令串"

我么看個例子:

ubuntu@VM-0-14-ubuntu:~$cat/etc/shadow
cat:/etc/shadow:Permissiondenied#ubuntu用戶不能直接查看/etc/shadow文件內容

ubuntu@VM-0-14-ubuntu:~$su--c"tail-n4/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:~$#執行完馬上返回ubuntu用戶而不是root用戶

這種執行方式和后面要介紹的 sudo 很像,都是臨時申請一下 root 用戶的權限。但還是有差異,我們接著往后看。

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

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

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

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

我們開始。

3.1 主要用法

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

那如果我們想要查看怎么辦呢?這時候就可以使用 sudo :

ubuntu@VM-0-14-ubuntu:~$tail-n3/etc/shadow
tail:cannotopen'/etc/shadow'forreading:Permissiondenied#沒有權限
ubuntu@VM-0-14-ubuntu:~$sudo!!#跟兩個驚嘆號
sudotail-n3/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 。

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

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

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

切換到 root 用戶:

sudosu-

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

  • 前者輸入 sudo su - 后,需要提供當前用戶的登錄密碼,也就是 ubuntu 用戶的密碼;

  • 后者輸入 su - 后,需要提供 root 用戶的登錄密碼。

還有一個命令:

sudo-i

這個命令和 sudo su - 效果一致,也是切換到 root 用戶,也是需要提供當前用戶(ubuntu 用戶)的登錄密碼。

我們現在切換到 test_user 用戶,嘗試顯示 /etc/shadow 文件的內容:

ubuntu@VM-0-14-ubuntu:~$su-test_user
Password:#test_user的密碼
$sudocat/etc/shadow
[sudo]passwordfortest_user:#test_user的密碼
test_userisnotinthesudoersfile.Thisincidentwillbereported.
$

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

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

3.2 sudo 工作原理

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

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

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

需要說明的是,只有 root 用戶有權限使用 visudo 命令。

我們先來看下輸入 visudo 命令后顯示的內容。

輸入(root 用戶):

root@VM-0-14-ubuntu:~#visudo

輸出:

#Userprivilegespecification
rootALL=(ALL:ALL)ALL

#Membersoftheadmingroupmaygainrootprivileges
%adminALL=(ALL)ALL

#Allowmembersofgroupsudotoexecuteanycommand
%sudoALL=(ALL:ALL)ALL

#Seesudoers(5)formoreinformationon"#include"directives:

#includedir/etc/sudoers.d
ubuntuALL=(ALL:ALL)NOPASSWD:ALL

解釋下每一行的格式:

  • 第一個表示用戶名,如 root 、ubuntu 等;

  • 接下來等號左邊的 ALL 表示允許從任何主機登錄當前的用戶賬戶;

  • 等號右邊的 ALL 表示:這一行行首對一個的用戶可以切換到系統中任何一個其它用戶;

  • 行尾的 ALL 表示:當前行首的用戶,能以 root 用戶的身份下達什么命令,ALL 表示可以下達任何命令。

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

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

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

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

接下來我們再在 test_user 賬戶下執行 sudo :

ubuntu@VM-0-14-ubuntu:~$su-test_user
Password:
$tail-n3/etc/shadow
tail:cannotopen'/etc/shadow'forreading:Permissiondenied
$sudotail-n3/etc/shadow#加上sudo
ntp:*:17752:0:99999:7:::
mysql:!:18376:0:99999:7:::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::
$

可以看到,現在已經可以使用 sudo 了。

3.3 思考

我們已經看到了,如果一個用戶在 /etc/sudoers 文件中,那么它就具有 sudo 權限,就能通過 sudo su - 或者 sudo -i 等命令切換到 root 用戶了,那這時這個用戶就變成 root 用戶了,那這不對系統造成很大的威脅嗎?

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

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

4. 二者的差異對比

我們已經看到:

  • 使用 su - ,提供 root 賬戶的密碼,可以切換到 root 用戶;

  • 使用 sudo su - ,提供當前用戶的密碼,也可以切換到 root 用戶

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

一般都是推薦使用 sudo 方式。

References

  • https://www.rootusers.com/the-difference-between-su-and-sudo-commands-in-linux/

  • 《鳥哥的 Linux 私房菜》13.4 節:使用者身份切換

  • https://github.com/ustclug/Linux101-docs/blob/master/docs/Ch05/index.md

  • https://www.maketecheasier.com/differences-between-su-sudo-su-sudo-s-sudo-i/

  • https://stackoverflow.com/questions/35999671/whats-the-difference-between-sudo-i-and-sudo-su?r=SearchResults

  • https://www.zhihu.com/question/51746286

  • https://www.linuxidc.com/Linux/2017-06/144916.htm

來源:Jun Tao
地址:https://tanjuntao.github.io/

責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11229

    瀏覽量

    208927
  • 命令
    +關注

    關注

    5

    文章

    678

    瀏覽量

    21984

原文標題:Linux 命令 su 和 sudo 的區別

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RTOS與Linux到底什么區別

    很多做嵌入式開發的小伙伴都存在這樣的疑惑:RTOS與Linux到底什么區別
    的頭像 發表于 10-29 09:53 ?323次閱讀

    嵌入式學習-常見的shell命令之其他命令

    :elf@ubuntu:~$ man ls3、su/sudo用戶切換命令sudo:暫時切換到超級用戶以執行超級用戶權限su:切換到某某用戶4
    發表于 08-22 09:42

    常見的shell命令之其他命令

    :elf@ubuntu:~$ man ls3、su/sudo用戶切換命令sudo:暫時切換到超級用戶以執行超級用戶權限su:切換到某某用戶4
    發表于 08-21 09:49

    RTOS與Linux什么區別

    RTOS(Real-Time Operating System,實時操作系統)與Linux是兩種在不同應用場景下發揮重要作用的操作系統,它們在設計理念、功能特性、應用場景以及性能表現等方面存在顯著差異。以下是對RTOS與Linux區別
    的頭像 發表于 08-20 16:05 ?3008次閱讀

    RV 和ARM什么區別

    district RV 和ARM什么區別
    發表于 06-26 12:41

    線路板的層和階什么區別

    線路板的層和階什么區別
    的頭像 發表于 02-23 17:27 ?664次閱讀

    SPI和QSPI什么區別

    SPI和QSPI什么區別
    發表于 02-06 06:12

    求助,TC275不同的STEP什么區別

    TC275不同的STEP什么區別?我看了一些芯片CA-STEP,DB-STEP,DC-STEP這幾個step
    發表于 02-04 07:34

    微軟在Windows Server最新預覽版測試原生sudo命令,有望實現

    在此需補充的是,sudo 命令可令普通用戶在特定指令,以管理員級別的權限運行。換言之,非root用戶亦能使用root級別特權。此特性,既提高了用戶操作效率,也降低了因誤操作導致的問題的發生率。
    的頭像 發表于 02-01 14:15 ?500次閱讀

    電源的EMI和EMC什么區別

    電源的EMI和EMC什么區別? 電源的EMI和EMC是與電磁干擾相關的兩個概念,盡管它們一些相似之處,但它們
    的頭像 發表于 01-19 11:47 ?1554次閱讀

    Linux基本命令總結

    都說Linux命令多,實際工作我們又有多少命令會接觸用到呢?本文跟大家分享Linux運維工作中常用的600個
    的頭像 發表于 01-11 10:32 ?941次閱讀

    hdi板與普通pcb什么區別

    hdi板與普通pcb什么區別
    的頭像 發表于 12-28 10:26 ?2709次閱讀

    pcb軟板和硬板什么區別

    pcb軟板和硬板什么區別
    的頭像 發表于 12-19 10:01 ?1822次閱讀

    RDMA和TCP/IP什么區別

    在分布式存儲網絡,我們使用的協議RoCE、Infiniband(IB)和TCP/IP。其中RoCE和IB屬于RDMA (RemoteDirect Memory Access)技術,他和傳統的TCP/IP
    的頭像 發表于 11-30 09:19 ?1678次閱讀
    RDMA和TCP/IP<b class='flag-5'>有</b><b class='flag-5'>什么區別</b>

    susudo命令介紹及主要用法

    大家在自己實驗服務器上可能不會用到susudo命令,因為一直用著root用戶進行操作。
    的頭像 發表于 11-27 09:31 ?1084次閱讀