概覽
sudo
表示 “superuser do”。 它允許已驗證的使用者以其他使用者的身份來運作指令。其他使用者可以是普通使用者或者超級使用者。然而,大部分時候我們用它來以提升的權限來運作指令。
sudo
指令與安全政策配合使用,預設安全政策是
sudoers
,可以通過檔案
/etc/sudoers
來配置。其安全政策具有高度可拓展性。人們可以開發和分發他們自己的安全政策作為插件。
與 su 的差別
在 GNU/Linux 中,有兩種方式可以用提升的權限來運作指令:
- 使用
指令su
-
sudo
su
表示 “switch user”。使用
su
,我們可以切換到 root 使用者并且執行指令。但是這種方式存在一些缺點:
- 我們需要與他人共享 root 的密碼。
- 因為 root 使用者為超級使用者,我們不能授予受控的通路權限。
- 我們無法審查使用者在做什麼。
sudo
以獨特的方式解決了這些問題。
- 首先,我們不需要妥協來分享 root 使用者的密碼。普通使用者使用他們自己的密碼就可以用提升的權限來執行指令。
- 我們可以控制
使用者的通路,這意味着我們可以限制使用者隻執行某些指令。sudo
- 除此之外,
使用者的所有活動都會被記錄下來,是以我們可以随時審查進行了哪些操作。在基于 Debian 的 GNU/Linux 中,所有活動都記錄在sudo
檔案中。/var/log/auth.log
本教程後面的部分闡述了這些要點。
實際動手操作 sudo
現在,我們對 sudo 有了大緻的了解。讓我們實際動手操作吧。為了示範,我使用 Ubuntu。但是,其它發行版本的操作應該是相同的。
允許 sudo 權限
讓我們添加普通使用者為
sudo
使用者吧。在我的情形中,使用者名為
linuxtechi
。
1) 按如下所示編輯
/etc/sudoers
檔案:
$ sudo visudo
2) 添加以下行來允許使用者
linuxtechi
有 sudo 權限:
linuxtechi ALL=(ALL) ALL
上述指令中:
-
表示使用者名linuxtechi
- 第一個
訓示允許從任何終端、機器通路ALL
sudo
- 第二個
訓示(ALL)
指令被允許以任何使用者身份執行sudo
- 第三個
表示所有指令都可以作為 root 執行ALL
以提升的權限執行指令
要用提升的權限執行指令,隻需要在指令前加上
sudo
,如下所示:
$ sudo cat /etc/passwd
當你執行這個指令時,它會詢問
linuxtechi
的密碼,而不是 root 使用者的密碼。
以其他使用者執行指令
除此之外,我們可以使用
sudo
以另一個使用者身份執行指令。例如,在下面的指令中,使用者
linuxtechi
以使用者
devesh
的身份執行指令:
$ sudo -u devesh whoami
[sudo] password for linuxtechi:
devesh
内置指令行為
sudo
的一個限制是 —— 它無法使用 Shell 的内置指令。例如,
history
記錄是内置指令,如果你試圖用
sudo
執行這個指令,那麼會提示如下的未找到指令的錯誤:
$ sudo history
[sudo] password for linuxtechi:
sudo: history: command not found
通路 root shell
為了克服上述問題,我們可以通路 root shell,并在那裡執行任何指令,包括 Shell 的内置指令。
要通路 root shell, 執行下面的指令:
$ sudo bash
執行完這個指令後——您将觀察到提示符變為井号(
#
)。
技巧
這節我們将讨論一些有用的技巧,這将有助于提高生産力。大多數指令可用于完成日常任務。
以 sudo 使用者執行之前的指令
讓我們假設你想用提升的權限執行之前的指令,那麼下面的技巧将會很有用:
$ sudo !4
上面的指令将使用提升的權限執行曆史記錄中的第 4 條指令。
在 Vim 裡面使用 sudo 指令
很多時候,我們編輯系統的配置檔案時,在儲存時才意識到我們需要 root 通路權限來執行此操作。因為這個可能讓我們丢失我們對檔案的改動。沒有必要驚慌,我們可以在 Vim 中使用下面的指令來解決這種情況:
:w !sudo tee %
- 冒号 (
) 表明我們處于 Vim 的退出模式:
- 感歎号 (
) 表明我們正在運作 shell 指令!
-
和sudo
都是 shell 指令tee
- 百分号 (
) 表明從目前行開始的所有行%
使用 sudo 執行多個指令
至今我們用
sudo
隻執行了單個指令,但我們可以用它執行多個指令。隻需要用分号 (
;
) 隔開指令,如下所示:
$ sudo -- bash -c 'pwd; hostname; whoami'
上述指令中
- 雙連字元 (
) 停止指令行切換--
-
表示要用于執行指令的 shell 名稱bash
-
選項後面跟着要執行的指令-c
無密碼運作 sudo 指令
當第一次執行
sudo
指令時,它會提示輸入密碼,預設情形下密碼被緩存 15 分鐘。但是,我們可以避免這個操作,并使用
NOPASSWD
關鍵字禁用密碼認證,如下所示:
linuxtechi ALL=(ALL) NOPASSWD: ALL
限制使用者執行某些指令
為了提供受控通路,我們可以限制
sudo
使用者隻執行某些指令。例如,下面的行隻允許執行
echo
ls
指令 。
linuxtechi ALL=(ALL) NOPASSWD: /bin/echo /bin/ls
深入了解 sudo
讓我們進一步深入了解
sudo
指令。
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 145040 Jun 13 2017 /usr/bin/sudo
如果仔細觀察檔案權限,則發現
sudo
上啟用了 setuid 位。當任何使用者運作這個二進制檔案時,它将以擁有該檔案的使用者權限運作。在所示情形下,它是 root 使用者。
為了示範這一點,我們可以使用
id
指令,如下所示:
$ id
uid=1002(linuxtechi) gid=1002(linuxtechi) groups=1002(linuxtechi)
當我們不使用
sudo
執行
id
指令時,将顯示使用者
linuxtechi
的 id。
$ sudo id
uid=0(root) gid=0(root) groups=0(root)
但是,如果我們使用
sudo
id
指令時,則會顯示 root 使用者的 id。
結論
從這篇文章可以看出 ——
sudo
為普通使用者提供了更多受控通路。使用這些技術,多使用者可以用安全的方式與 GNU/Linux 進行互動。
下面一篇介紹
在 Linux 下 9 個有用的 touch 指令示例原文位址:
https://linux.cn/article-9559-1.html