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狀態下. 為了頻繁的執行某些只有超級用戶才能執行的權限,而不用每次輸入密碼,可以使用該命令。提示輸入密碼時該密碼為當前賬戶的密碼。沒有時間限制。執行該命令后提示符變為“#”而不是“$”。想退回普通賬戶時可以執行
exit
或logout
。
sudo !!
Linux命令行記錄以前執行的命令。可以通過按向上箭頭訪問這些記錄。要以提升的特權重復執行最后一個命令,請使用
> sudo !!
sudo !n
想要作為root授權來運行一個命令,但是忘記使用“sudo”了?不要擔心。我們可以使用”sudo !!”結合命令歷史來執行你想要執行的命令。參數”!!“和”!-1“作用一樣,都是允許用戶作為root來執行我們剛才輸入的命令。當然,以此類推,我們可以使用下面命令來執行倒數第二個命令:
> sudo !-2
原文鏈接:https://rumenz.com/rumenbiji/linux-sudo-skills.html
微信公眾號:入門小站