日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 命令之 sudo -- 以其他用户身份来执行命令

發布時間:2023/12/3 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 命令之 sudo -- 以其他用户身份来执行命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 命令介紹
  • 原理
  • 相關文件
    • 通配符
  • 和命令 su 的比較
  • 常用選項
  • 幾個重要選項的解讀
    • -k 選項
    • -s 選項
    • -i 選項
  • su、sudo su、sudo -i 的區別
  • 查看日志文件
  • 參考示例
    • 以用戶 mysql 的身份執行命令 pwd
    • 以用戶 root 的身份執行命令 pwd
    • 以 root 的權限執行上一條命令
    • 以 root 的權限編輯指定的文件
    • 普通用戶切換成 root 身份
    • 使用 root 的身份執行最近一條指令
    • 使用 sudo 切換 Shell 類型
    • 切換成指定的用戶
    • 顯示當前用戶可以用 sudo 執行哪些命令
    • 通過加入群組的方式給普通用戶授權

命令介紹

substitute user identity to do,替換身份去執行,縮寫為 sudo。

sudo 命令用來以其他身份來執行命令,預設的身份為 root。在 /etc/sudoers 中設置了可執行 sudo 指令的用戶。若其未經授權的用戶企圖使用 sudo,則會發出警告的郵件給管理員。用戶使用 sudo 時,必須先輸入密碼,之后有 5 分鐘的有效期限,超過期限則必須重新輸入密碼。

簡單的說,sudo 是一種權限管理機制,管理員可以授權一些普通用戶去執行一些 root 執行的操作,而不需要知道 root 的密碼。普通用戶必須在文件 /etc/sudoers 中進行有關授權,才能使用命令 sudo。

更加正確地說法是,sudo 允許一個已授權用戶以超級用戶或者其它用戶的角色運行一個命令。當然,能做什么不能做什么都是通過安全策略來指定的。sudo 支持插件架構的安全策略,并能把輸入輸出寫入日志。第三方可以開發并發布自己的安全策略和輸入輸出日志插件,并讓它們無縫的和 sudo 一起工作。默認的安全策略記錄在 /etc/sudoers 文件中。而安全策略可能需要用戶通過密碼來驗證他們自己。也就是在用戶執行 sudo 命令時要求用戶輸入自己賬號的密碼。如果驗證失敗,sudo 命令將會退出。

原理

sudo 使一般用戶不需要知道超級用戶的密碼即可獲得權限。首先超級用戶將普通用戶的名字、可以執行的特定命令、按照哪種用戶或用戶組的身份執行等信息,登記在特殊的文件中(通常是 /etc/sudoers),即完成對該用戶的授權(此時該用戶稱為“sudoer”);在一般用戶需要取得特殊權限時,其可在命令前加上 sudo,此時 sudo 將會詢問該用戶自己的密碼(以確認終端機前的是該用戶本人),回答后系統即會將該命令的進程以超級用戶的權限運行。之后的一段時間內(默認為5分鐘,可在 /etc/sudoers 自定義),使用 sudo 不需要再次輸入密碼。

sudo 命令的運行,需經歷如下幾步:

當用戶運行 sudo 命令時,系統會先通過 /etc/sudoers 文件,驗證該用戶是否有運行 sudo 的權限;
確定用戶具有使用 sudo 命令的權限后,還要讓用戶輸入自己的密碼進行確認。出于對系統安全性的考慮,如果用戶在默認時間內(默認是 5 分鐘)不使用 sudo 命令,此后使用時需要再次輸入密碼;
密碼輸入成功后,才會執行 sudo 命令后接的命令。

顯然,能否使用 sudo 命令,取決于對 /etc/sudoers 文件的配置(默認情況下,此文件中只配置有 root 用戶)。默認情況下 sudo 命令只有 root 身份可以使用。

相關文件

配置文件:
/etc/sudoers
/etc/sudoers.d/

時間戳文件:
/var/db/sudo

日志文件:
/var/log/secure

通配符

?:匹配任意一個字符 *:匹配任意數量的任意字符 [wxc]:匹配其中一個字符 [!wxc]:除了這三個字符的其它字符 \x:轉義 [[alpha]]:表示匹配任意一個英文字母。示例:/bin/ls [[alpha]]*

和命令 su 的比較

相對于使用 su 命令還需要新切換用戶的密碼,sudo 命令的運行只需要知道自己的密碼即可,甚至于,我們可以通過手動修改 sudo 的配置文件,使其無需任何密碼即可運行。

常用選項

選項說明
-b在后臺執行指令
-e 或 --edit編輯文件而非執行命令,等效于 sudoedit
-i 或 --login以目標用戶身份登錄 shell,可同時指定一條命令。其實就是相當于使用目標用戶的身份重新登錄 shell
-H將HOME環境變量設為新身份的HOME環境變量
-k結束密碼的有效期限,也就是下次再執行sudo時便需要輸入密碼。強迫使用者在下一次執行 sudo 時輸入密碼(不論有沒有超過 N 分鐘)
-l列出目前用戶可執行與無法執行的指令。顯示出自己(執行 sudo 的使用者)的權限。用于顯示當前用戶可以用 sudo 執行那些命令
-p改變詢問密碼的提示符號,即可以更改問密碼的提示語,其中 %u 會代換為使用者的帳號名稱,%h 會顯示主機名稱
-s<shell>執行指定的shell。執行環境變量 SHELL 中所指定的 shell ,或是 /etc/passwd 里所指定的 shell
-S從標準輸入流替代終端來獲取密碼
-u<用戶>以指定的用戶作為新的身份。若不加上此參數,則預設以root作為新的身份
-v延長密碼有效期限5分鐘。因為 sudo 在第一次執行時或是在 N分鐘內沒有執行(N 預設為五)會提示輸入密碼,這個參數是重新做一次確認,如果超過N分鐘,也會提示輸入密碼
-V顯示版本信息
-h顯示幫助

幾個重要選項的解讀

-k 選項

考慮下這種情況:
輸入密碼后你剛剛運行了幾個 sudo 驅動的命令,而 sudo 會話默認保持 5 分鐘。假設在這會話期間,你需要讓某些人訪問你的終端,但你不想讓他們可以使用 sudo,你將會怎么做?沒錯,-k 選項允許用戶提前結束 sudo 會話的有效期。

以下是 sudo 幫助頁面的解釋:

-k, --reset-timestamp

不帶任何命令使用時,撤銷用戶緩存的憑據。換句話講,下一次使用sudo將會要求輸入密碼。使用這個參數不需要密碼,也可以放到一個
./logout文件中來撤銷 sudo 權限。

當與一個命令,或者一個可能需要密碼的操作一起用時,這個參數將會導致sudo忽略用戶緩存的憑據。結果是sudo要求輸入密碼(如果這是被安全策略所要求的),而且不會更新用戶緩存的憑據。

-s 選項

有時你的工作要求你運行一堆需要 root 權限的命令,你不想每次都輸入密碼。你也不想通過改變/etc/sudoers文件調整sudo會話的過期時限。

這種情況下,你可以用 sudo 的 -s 選項。以下是 sudo 幫助頁面的解釋:

-s,–shell

如果設置了 SHELL 環境變量或者調用用戶的密碼數據庫指定了 shell,就運行該 shell 。如果指定了命令,命令將會通過 shell
的 -c參數將命令傳遞給該 shell 執行。如果沒有指定命令,會執行一個交互式 shell。

所以,基本上這命令參數做的是:

1.啟動一個新的 shell,至于是哪一個 shell,參照 SHELL 環境變量賦值。如果 $SHELL 是空的,將會用 /etc/passwd 中定義的 shell。
2.如果你用 -s 參數傳遞了一個命令名(例如,sudo -s whoami),實際執行的是 sudo /bin/bash -c whoami。
3.如果你沒有嘗試執行其他命令(也就是說,你只是運行 sudo -s),你將會得到一個有 root 權限的交互式的 shell。
4.請記住,-s 命令行參數給你一個有 root 權限的 shell,但那不是 root 環境 —— 還是執行的你自己的 .bashrc。例如,在 sudo -s 運行的新 shell 里,執行 whoami 命令仍會返回你的用戶名,而非 root 。

-i 選項

-i 選項和 -s 選項相像。然而,還是有點區別。一個重要的區別是 -i 給你的是 root 環境,意味著原用戶的 .bashrc 被忽略。這就像沒有顯式地用 root 登錄也能成為 root 。此外,你也不用輸入 root 用戶密碼。

su、sudo su、sudo -i 的區別

補充…

查看日志文件

在 ubuntu 中,sudo 的日志默認被記錄在 /var/log/auth.log 文件中。當我們執行 sudo 命令時,相關日志都是會被記錄下來的。比如下圖中顯示的就是一次執行 sudo 命令的日志:

在 CentOS 中查看日志 /vat/log/secure:

[root@localhost ~]# tail /var/log/secure Apr 5 13:55:58 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0) Apr 5 13:56:11 localhost su: pam_unix(su-l:session): session closed for user tom Apr 5 13:56:17 localhost passwd: pam_unix(passwd:chauthtok): password changed for tom Apr 5 13:56:17 localhost passwd: gkr-pam: couldn't update the 'login' keyring password: no old password was entered Apr 5 13:56:23 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0) Apr 5 13:56:43 localhost sudo: tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=list ##tom以管理員身份執行了list命令 Apr 5 14:00:50 localhost sudo: tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=/usr/sbin/useradd test1 ##tom以管理員身份執行了useradd命令,添加用戶test1 Apr 5 14:00:50 localhost useradd[2128]: new group: name=test1, GID=501 Apr 5 14:00:50 localhost useradd[2128]: new user: name=test1, UID=501, GID=501, home=/home/test1, shell=/bin/bash Apr 5 14:07:15 localhost su: pam_unix(su-l:session): session closed for user tom

以后可以查看日志文件分析主機是否遭到入侵攻擊,或者查看某用戶登錄進來并使用特殊權限執行了哪些指令等。所以我們要實時監控此文件的動向。

參考示例

以用戶 mysql 的身份執行命令 pwd

當前登錄用戶是 root,我要以 mysql 的身份執行命令 pwd,命令如下:

[root@htlwk0001host ~]# sudo -u mysql pwd /root

以用戶 root 的身份執行命令 pwd

當前登錄用戶是 mysql,我要以 root 的身份執行命令 pwd,命令語句如下:

[mysql@htlwk0001host root]$ sudo pwd [sudo] mysql 的密碼: mysql 不在 sudoers 文件中。此事將被報告。

注:
1.sudo 沒有使用選項 -u 來指定其它用戶,默認是 root 用戶
2.從上面輸出結果可以知道,使用命令 sudo,需要輸入當前登錄用戶自己的密碼
3.當前登錄用戶沒有在 /etc/sudoers 文件中,所以不能使用命令 sudo

這個命令相當于使用 root 超級用戶重新登錄一次 shell,只不過密碼是當前登錄用戶的密碼。而且重要是,該命令會重新加載 /etc/profile 文件以及 /etc/bashrc 文件等系統配置文件,并且還會重新加載 root 用戶的 $SHELL 環境變量所對應的配置文件 ,比如:root 超級用戶的$SHELL 是 /bin/bash,則會加載 /root/.bashrc 等配置。如果是 /bin/zsh,則會加載 /root/.zshrc 等配置,執行后是完全的 root 環境。

以 root 的權限執行上一條命令

如果由于你忘了使用 sudo 而導致命令行返回一個錯誤,只需輸入 sudo !! 就可以用 sudo 來執行上一條指令:

[mysql@htlwk0001host ~]$ sudo !!

以 root 的權限編輯指定的文件

[root@htlwk0001host mysql]# sudo -e /root/student.txt

使用命令 sudo,如果沒有使用選項 -u 指定用戶,默認是 root 用戶。這條命令等效下面這條指令:

[root@htlwk0001host mysql]# sudoedit /root/student.txt

普通用戶切換成 root 身份

當前登錄用戶是 mysql,想切換成用戶 root,可以執行下面的命令:

[mysql@htlwk0001host ~]$ sudo -i [sudo] mysql 的密碼:

注:
1.這里是輸入用戶 mysql 自己的登錄密碼。
2.必須在文件 /etc/sudoers 中配置用戶 mysql 有關 sudo 的權限(即授權),用戶 mysql 才能使用命令 sudo。
3.選項 -i,表示以目標用戶 root 登錄 shell,這樣切換成用戶 root 后,相關的運行環境也改變成用戶 root 的運行環境,感覺好像就是以用戶 root 登錄 shell 一樣,其實還是有區別的,具體需要參閱手冊。

也可以使用命令 su 切換成 root 用戶:

[mysql@htlwk0001host ~]$ su root 密碼:

這里需要輸入用戶 root 的登錄密碼。

使用 root 的身份執行最近一條指令

如果由于你忘了使用 sudo 而導致命令行返回一個錯誤,只需輸入 sudo !! 就可以用 sudo 來執行上一條指令。

使用 sudo 切換 Shell 類型

如果你需要執行很多條需要 root 權限的命令,你可以臨時切換整個命令行 shell 來取得 root 級別的訪問權限。方法就是先輸入sudo -s,回車后再鍵入你的密碼。

感覺 -s 選項有點類似 -i 選項,都可以切換指定用戶身份。

切換成指定的用戶

[root@htlwk0001host ~]# sudo -u mysql -i [mysql@htlwk0001host ~]$

或者

[root@htlwk0001host ~]# sudo -u mysql -s [mysql@htlwk0001host root]$

感覺 -s 選項有點類似 -i 選項,都可以切換成指定的用戶身份。但是兩者肯定有區別,我沒有研究出本質的區別,目前可以知道的就是使用選項 -i 切換后當前工作目錄會改成目標用戶的家目錄,而選項 -s 則沒有改變,但是這點并不是很重要,我查看了兩種選項切換后的環境變量,也都改成了目標用戶的環境變量。

重要:請注意 su 命令也能讓你切換用戶(默認切換到 root )。這個命令需要你輸入 root 密碼。為了避免這一點,你可以使用 sudo 執行它

[mysql@htlwk0001host root]$ sudo su [sudo] mysql 的密碼: [root@htlwk0001host ~]#

這樣你只需要輸入你的登錄密碼。

顯示當前用戶可以用 sudo 執行哪些命令

[lamp@localhost ~]$ sudo -l [sudo] password for lamp: # 需要輸入lamp用戶的密碼 User lamp may run the following commands on this host: (root) /sbin/shutdown -r now

可以看到,lamp 用戶擁有了 shutdown -r now 的權限。這時,lamp 用戶就可以使用 sudo 執行如下命令重啟服務器:

[lamp@localhost ~]$ sudo /sbin/shutdown -r now

通過加入群組的方式給普通用戶授權

ubuntu 系統默認創建了一個名為 sudo 的組。只要把用戶加入這個組,用戶就具有了 sudo 的權限。
至于如何把用戶加入 sudo 組,您可以直接編輯 /etc/group 文件,當然您得使用一個有 sudo 權限的用戶來干這件事:

$ sudo vim /etc/group

在 sudo 組中加入新的用戶,要使用逗號分隔多個用戶:

sudo:x:27:nick,jack

或者您可以使用 usermod 命令把用戶 jack 添加到一個 sudo 用戶組中:

$ sudo usermod -a -G sudo jack

上面的設置中我們把用戶 jack 添加到了 sudo 組中,所以當用戶 jack 登錄后就可以通過 sudo 命令以 root 權限執行命令了!

總結

以上是生活随笔為你收集整理的Linux 命令之 sudo -- 以其他用户身份来执行命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。