天天看點

Linux 系統中 sudo 指令的 10 個技巧

概覽

sudo

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

sudo

指令與安全政策配合使用,預設安全政策是

sudoers

,可以通過檔案

/etc/sudoers

來配置。其安全政策具有高度可拓展性。人們可以開發和分發他們自己的安全政策作為插件。

與 su 的差別

在 GNU/Linux 中,有兩種方式可以用提升的權限來運作指令:

  • 使用

    su

    指令
  • sudo

su

表示 “switch user”。使用

su

,我們可以切換到 root 使用者并且執行指令。但是這種方式存在一些缺點:

  • 我們需要與他人共享 root 的密碼。
  • 因為 root 使用者為超級使用者,我們不能授予受控的通路權限。
  • 我們無法審查使用者在做什麼。

sudo

以獨特的方式解決了這些問題。

  1. 首先,我們不需要妥協來分享 root 使用者的密碼。普通使用者使用他們自己的密碼就可以用提升的權限來執行指令。
  2. 我們可以控制

    sudo

    使用者的通路,這意味着我們可以限制使用者隻執行某些指令。
  3. 除此之外,

    sudo

    使用者的所有活動都會被記錄下來,是以我們可以随時審查進行了哪些操作。在基于 Debian 的 GNU/Linux 中,所有活動都記錄在

    /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

    指令被允許以任何使用者身份執行
  • 第三個

    ALL

    表示所有指令都可以作為 root 執行

以提升的權限執行指令

要用提升的權限執行指令,隻需要在指令前加上

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

    tee

    都是 shell 指令
  • 百分号 (

    %

    ) 表明從目前行開始的所有行

使用 sudo 執行多個指令

至今我們用

sudo

隻執行了單個指令,但我們可以用它執行多個指令。隻需要用分号 (

;

) 隔開指令,如下所示:

$ sudo -- bash -c 'pwd; hostname; whoami'


           

上述指令中

  • 雙連字元 (

    --

    ) 停止指令行切換
  • bash

    表示要用于執行指令的 shell 名稱
  • -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

繼續閱讀