0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

su與sudo命令介紹及主要用法

jf_TEuU2tls ? 來源:浩道linux ? 2023-11-27 09:31 ? 次閱讀

前言

大家在自己實驗服務(wù)器上可能不會用到su與sudo命令,因為一直用著root用戶進(jìn)行操作。但是在實際生產(chǎn)環(huán)境,運維人員是不會拿到root的權(quán)限的。尤其在甲方,更加的難給到運維root權(quán)限。我就遇到過此類現(xiàn)象,之前實習(xí)生讓安裝部署個mysql、redis等中間件時,他還傻傻問人家甲方用root用戶密碼,這不被甲方噴就算好的了。實際上通過su與sudo是足夠完成的了。本文也帶大家一起來使用su與sudo,避免你有一天被人家噴不懂用!

su命令介紹及主要用法

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

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

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

-參數(shù)

su的一般使用方法是:

su``

或者

su-``

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

如果加入了-參數(shù),那么是一種login-shell的方式,意思是說切換到另一個用戶之后,當(dāng)前的 shell 會加載對應(yīng)的環(huán)境變量和各種設(shè)置;

如果沒有加入-參數(shù),那么是一種non-login-shell的方式,意思是說我現(xiàn)在切換到了,但是當(dāng)前的 shell 還是加載切換之前的那個用戶的環(huán)境變量以及各種設(shè)置。

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

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

rumenz@local:~$env|grepubuntu
USER=ubuntu
PWD=/home/ubuntu#是/home/ubuntu
HOME=/home/ubuntu
#省略......
rumenz@local:~$su#non-login-shell方式
Password:#輸入root用戶登錄密碼
rumenz@local:/home/ubuntu#env|grepubuntu
PWD=/home/ubuntu#可以發(fā)現(xiàn)還是/home/ubuntu
rumenz@local:/home/ubuntu#

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

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

rumenz@local:~$env|grepubuntu
USER=ubuntu
PWD=/home/ubuntu#是/home/ubuntu
HOME=/home/ubuntu
#省略.......
rumenz@local:~$su-#是login-shell方式
Password:
rumenz@local:~#env|greproot
USER=root
PWD=/root#已經(jīng)變成/root了
HOME=/root
MAIL=/var/mail/root
LOGNAME=root
rumenz@local:~#

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

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

如果不想因為切換到另一個用戶導(dǎo)致自己在當(dāng)前用戶下的設(shè)置不可用,那么用non-login-shell的方式;

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

切換到指定用戶

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

rumenz@local:~$su-
Password:#root用戶的密碼
rumenz@local:/home/ubuntu#

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

rumenz@local:~$su-test_user
Password:#test_user用戶的密碼
$

-c參數(shù)

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

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

具體使用方法是:

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

看個例子:

rumenz@local:~$cat/etc/shadow
cat:/etc/shadow:Permissiondenied#ubuntu用戶不能直接查看/etc/shadow文件內(nèi)容

rumenz@local:~$su--c"tail-n4/etc/shadow"
Password:#輸入root用戶密碼
ubuntu:$1$fZKcWEDI$uwZ64uFvVbwpHTbCSgim0/07:::
ntp1775299999::
mysql1837699999::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07:::
rumenz@local:~$#執(zhí)行完馬上返回ubuntu用戶而不是root用戶

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

sudo命令介紹及主要用法

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

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

主要用法

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

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

rumenz@local:~$tail-n3/etc/shadow
tail:cannotopen'/etc/shadow'forreading:Permissiondenied#沒有權(quán)限
rumenz@local:~$sudo!!#跟兩個驚嘆號
sudotail-n3/etc/shadow
ntp1775299999::
mysql1837699999::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07:::
rumenz@local:~$

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

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

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

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

切換到 root 用戶:

sudosu-

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

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

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

還有一個命令:

sudo-i

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

我們現(xiàn)在切換到 test_user 用戶,嘗試顯示/etc/shadow文件的內(nèi)容:

rumenz@local:~$su-test_user
Password:#test_user的密碼
$sudocat/etc/shadow
[sudo]passwordfortest_user:#test_user的密碼
test_userisnotinthesudoersfile.Thisincidentwillbereported.
$

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

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

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 用戶):

rumenz@local:~#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表示允許從任何主機(jī)登錄當(dāng)前的用戶賬戶;

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

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

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

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

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

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

接下來我們再在 test_user 賬戶下執(zhí)行sudo:

rumenz@local:~$su-test_user
Password:
$tail-n3/etc/shadow
tail:cannotopen'/etc/shadow'forreading:Permissiondenied
$sudotail-n3/etc/shadow#加上sudo
ntp1775299999::
mysql1837699999::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/07:::
$

可以看到,現(xiàn)在已經(jīng)可以使用sudo了。

思考

我們已經(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)限都賦予該用戶將會有非常大的危險。

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

二者的差異對比

我們已經(jīng)看到:

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

使用sudo su -,提供當(dāng)前用戶的密碼,也可以切換到 root 用戶

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

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







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    590

    瀏覽量

    27317
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    363

    瀏覽量

    23259
  • Ubuntu系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    85

    瀏覽量

    3898

原文標(biāo)題:如果你不懂su與sudo用法,可能會被甲方噴的!

文章出處:【微信號:浩道linux,微信公眾號:浩道linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    常見的shell命令之其他命令

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

    嵌入式學(xué)習(xí)-常見的shell命令之其他命令

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

    在 Linux 中運行 sudo 命令不需要密碼

    命令在運行時而不輸入密碼。此設(shè)置在?/etc/sudoers?文件中完成,這是使用 sudo 命令的默認(rèn)安全策略;在用戶權(quán)限指定部分。重要:在?sudeors?文件中,默認(rèn)打開
    發(fā)表于 04-02 14:48 ?1111次閱讀

    Linux中易混淆命令的區(qū)別

    素材來源:Linux迷 sudosu 兩個命令的最大區(qū)別是:sudo 命令需要輸入當(dāng)前用戶的密碼,
    的頭像 發(fā)表于 09-25 14:25 ?1743次閱讀
    Linux中易混淆<b class='flag-5'>命令</b>的區(qū)別

    Linux中susudo命令有什么區(qū)別

    ? 之前一直對 susudo 這兩個命令犯迷糊,最近專門搜了這方面的資料,總算是把兩者的關(guān)系以及用法搞清楚了,這篇文章來系統(tǒng)總結(jié)一下。 1. 準(zhǔn)備工作 因為本篇博客中涉及到用戶切
    的頭像 發(fā)表于 11-19 09:19 ?1567次閱讀

    如何使用sudo命令以及選項

    sudo命令允許您以其他用戶身份運行命令與程序,默認(rèn)是root用戶。如果您是個命令行用戶,那么sudo是您將經(jīng)常使用的
    的頭像 發(fā)表于 12-09 17:47 ?5025次閱讀

    值得考慮的4個最佳Linux sudo命令替代方案

    對于那些不喜歡 sudo 并覺得它臃腫的人,可以嘗試使用幾種 sudo 替代方法。 sudo 可能是最常用的 Linux 命令之一。它允許您在 Linux 機(jī)器上獲得管理或提升的權(quán)限。
    的頭像 發(fā)表于 01-06 10:54 ?1913次閱讀

    unzip命令的作用及用法

    unzip 命令往往用于解壓縮 zip 文件,但它能做的不僅僅是如此。今天我們主要介紹一下該命令的作用及用法。
    的頭像 發(fā)表于 01-30 15:57 ?7778次閱讀

    Linux中root和sudo用法與區(qū)別

    Linux 下面有兩個概念可能大家接觸的比較多,一個是 sudo 命令,還有一個是 root 賬戶。Sudo 命令可以以最高權(quán)限執(zhí)行命令,而
    的頭像 發(fā)表于 03-29 09:17 ?951次閱讀

    Linux系統(tǒng)維護(hù)命令用法

    Linux有很多命令,每個命令基本可以用一篇文章介紹,本文僅簡單總結(jié)一些常用系統(tǒng)維護(hù)命令用法
    的頭像 發(fā)表于 04-17 14:57 ?994次閱讀
    Linux系統(tǒng)維護(hù)<b class='flag-5'>命令</b>的<b class='flag-5'>用法</b>

    Linux命令susudo的區(qū)別

    在 Linux 系統(tǒng)中,有兩個常用的命令用于切換用戶身份和執(zhí)行特權(quán)操作,它們分別是 susudo。雖然它們都可以實現(xiàn)權(quán)限提升,但在使用方式、安全性和適用場景等方面存在一些區(qū)別。本文將介紹
    發(fā)表于 08-14 14:14 ?275次閱讀

    首個Rust版sudo發(fā)布!

    sudo-rs項目則是用 Rust 編寫的 sudosu 的、面向安全和內(nèi)存安全的實現(xiàn)。官網(wǎng)聲明中顯示,sudo-rs 目前僅針對基于 Linux 的操作系統(tǒng);運行
    的頭像 發(fā)表于 09-01 15:59 ?754次閱讀
    首個Rust版<b class='flag-5'>sudo</b>發(fā)布!

    什么是sudo rm -rf?為什么這個命令如此危險?

    sudo rm -rf 是一個linux的命令命令,用于在系統(tǒng)中刪除文件和目錄。sudo表示以管理員權(quán)限運行該命令
    的頭像 發(fā)表于 10-24 18:25 ?2967次閱讀

    總結(jié)linux命令行的主要用法

    Linux命令行是一種在Linux操作系統(tǒng)中通過文本界面來執(zhí)行指令和管理系統(tǒng)的方式。它提供了豐富的功能和靈活性,幫助用戶完成各種任務(wù)。本文將詳細(xì)介紹Linux命令行的主要用法,包括常見
    的頭像 發(fā)表于 11-17 10:19 ?599次閱讀

    Linux lsof命令的基本用法

    在 linux 系統(tǒng)中,一切皆文件。通過文件不僅僅可以訪問常規(guī)數(shù)據(jù),還可以訪問網(wǎng)絡(luò)連接和硬件。所以 lsof 命令不僅可以查看進(jìn)程打開的文件、目錄,還可以查看進(jìn)程監(jiān)聽的端口等 socket 相關(guān)的信息。本文將介紹 lsof 命令
    的頭像 發(fā)表于 10-23 11:52 ?155次閱讀
    Linux lsof<b class='flag-5'>命令</b>的基本<b class='flag-5'>用法</b>