linux之sudo使用技巧匯總


sudo和su之間的區別

  • su用於用戶之間的切換
  • sudo用於普通用戶可以使用root權限來執行命令

su命令是當前用戶用來切換到另外一個用戶的命令,參數為用戶名。執行時會要求輸入密碼,這個密碼是你要切換到的用戶的密碼。

sudo 表示 “superuser do”。它允許已驗證的用戶以其他用戶的身份來運行命令。其他用戶可以是普通用戶或者超級用戶。然而,絕大部分時候我們用它來以提升的權限來運行命令。

sudo命令工作流程

  • sudo會讀取和解析/etc/sudoers文件,查找調用的用戶及權限
  • 提示調用該命令用戶的密碼,如果有NOPASSWD標志則跳過密碼驗證.
  • sudo會創建一個子進程,調用setuid來切換到目標用戶
  • 最后會在子進程中執行給定的shell命令

sudo的配置

USER/GROUP HOST=(USER[:GROUP]) [NOPASSWD:] COMMANDS
  • USER/GROUP: 表示要被授權的用戶或組,如果是組要以%開頭
  • HOST: 表示允許從哪些主機登錄的用戶運行sudo,ALL表示允許任何終端,機器訪問.
  • (USER[:GROUP]): 表示使用 sudo 可切換的用戶或者組,組可以不指定;ALL 表示可以切換到系統的所有用戶.
  • NOPASSWD:如果指定,則該用戶或者組使用sudo時就不用輸入密碼
  • COMMANDS:表示運行指定的命令,ALL表示允許指定任何命令
# 允許 sudo 組執行所有命令
%sudo ALL=(ALL:ALL) ALL

# 允許用戶執行所有命令,且無需輸入密碼
escape ALL =(ALL) NOPASSWD: ALL

# 僅允許用戶執行 echo, ls 命令
escape ALL =(ALL) NOPASSWD: /bin/echo /bin/ls

# 運行本機的用戶執行關機命令
escape localhost=/sbin/shutdown -h now

# 允許 users 用戶組中的用戶像 root 用戶一樣使用 mount、unmount、chrom 命令
%users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

以提升的權限執行命令

> sudo cat /etc/passwd

當你執行這個命令時,它會詢問 rumenz 的密碼,而不是root用戶的密碼。

以其他用戶執行命令

> sudo -u deploy whoami
deploy

內置命令行為

sudo 的一個限制是 —— 它無法使用 Shell 的內置命令。history記錄是內置命令,如果你試圖用sudo執行這個命令,那么會提示如下的未找到命令的錯誤:

> sudo history 
[sudo] password for rumenz: 
sudo: history: command not found

我們可以訪問 root shell,並在那里執行任何命令,包括 Shell 的內置命令。
要訪問 root shell, 執行下面的命令:

> [rumenz@localhost]$ sudo bash
> [root@localhost rumenz]# history

sudo執行多條命令

sudo -- bash -c 'pwd; hostname; whoami'
  • 雙連字符 (–) 停止命令行切換
  • bash 表示要用於執行命令的shell名稱
  • -c選項后面跟着要執行的命令

限制用戶執行某些命令

為了提供受控訪問,我們可以限制 sudo 用戶只執行某些命令。例如,下面的行只允許執行 echo 和 ls 命令 。

rumenz ALL=(ALL) NOPASSWD: /bin/echo /bin/ls

在 vim 里面使用 sudo 命令

我們編輯系統的配置文件時,在保存時才意識到我們需要 root 訪問權限來執行此操作。因為這個可能讓我們丟失我們對文件的改動。沒有必要驚慌,我們可以在 Vim 中使用下面的命令來解決這種情況

:w !sudo tee %
  • 冒號 (? 表明我們處於 Vim 的退出模式
  • 感嘆號 (!) 表明我們正在運行 shell 命令
  • sudo 和 tee 都是 shell 命令
  • 百分號 (%) 表明從當前行開始的所有行

sudo的原理

> ls -l /usr/bin/sudo
---s--x--x. 1 root root 143248 Jun 28  2018 /usr/bin/sudo

如果仔細觀察文件權限,則發現 sudo 上啟用了setuid位。當任何用戶運行這個二進制文件時,它將以擁有該文件的用戶權限運行。在所示情形下,它是root用戶。

當我們不使用sudo執行 id 命令時,將顯示用戶 rumenz 的 id。

> id
uid=1001(rumenz) gid=1001(rumenz) groups=1001(rumenz)

當使用sudo id

uid=0(root) gid=0(root) groups=0(root)

sudo -i

sudo -i:可以切換到root狀態下. 為了頻繁的執行某些只有超級用戶才能執行的權限,而不用每次輸入密碼,可以使用該命令。提示輸入密碼時該密碼為當前賬戶的密碼。沒有時間限制。執行該命令后提示符變為“#”而不是“$”。想退回普通賬戶時可以執行exitlogout

sudo !!

Linux命令行記錄以前執行的命令。可以通過按向上箭頭訪問這些記錄。要以提升的特權重復執行最后一個命令,請使用

> sudo !!

sudo !n

想要作為root授權來運行一個命令,但是忘記使用“sudo”了?不要擔心。我們可以使用”sudo !!”結合命令歷史來執行你想要執行的命令。參數”!!“和”!-1“作用一樣,都是允許用戶作為root來執行我們剛才輸入的命令。當然,以此類推,我們可以使用下面命令來執行倒數第二個命令:

> sudo !-2

原文鏈接:https://rumenz.com/rumenbiji/linux-sudo-skills.html
微信公眾號:入門小站


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM