這裡介紹如何在 Vim 編輯器中使用 sudo 取得 root 權限,讓一般使用者也可以寫入系統的設定檔。

通常管理者在維護 Linux 系統時,由於安全性的因素,不會使用 root 帳號直接登入系統,而是以一般使用者的帳號登入後,在需要 root 權限時再使用 susudo 指令取得 root 權限。


而在實務上當我們在修改系統的設定檔時,最常發生的狀況就是忘記先取得 root 權限,直接就以一般使用者的權限編輯設定檔,而在整個檔案都改好之後,要儲存檔案時才發現自己沒有權限寫入。

假設我們使用一般使用者的權限,編輯 /etc/hosts 這個設定檔,在儲存時就會有問題:

無權限寫入

當我們遇到這樣的狀況時,可以參可以下幾種解決方式。

另存新檔

若無法直接寫入系統的檔案,大家直覺上會想到的方式就是先把修改好的檔案內容儲存在一個暫存檔中:

:w /tmp/hosts.tmp

寫入暫存檔

然後在離開 Vim 之後,以 root 權限再將該暫存檔複製到要儲存的位置:

sudo cp /tmp/hosts.tmp /etc/hosts

最後將暫存檔刪除:

rm /tmp/hosts.tmp

sudo 存檔

暫存檔的方式雖然可行,但是步驟比較麻煩,另一種方式是直接在 Vim 中呼叫 sudo 取得 root 權限來寫入檔案,Vim 的指令如下:

:w !sudo tee %

root 權限寫入檔案

執行這行 Vim 指令之後,會需要輸入密碼以取得 root 權限,接著就可以直接將內容寫入檔案了。

這行 Vim 指令的結構比較複雜,詳細說明如下:

  • :w:普通的 Vim 寫入指令,只不過在這裡不是寫入檔案,而是將編輯器的內容寫入一個緩衝區,導向至後面的 shell 指令。
  • !sudo:執行 shell 並呼叫 sudo 指令。
  • tee:將輸入的資料(Vim 寫入緩衝區的資料)導向至標準輸出以及檔案。
  • %:這個符號在 Vim 中就是代表目前的檔案名稱,以這個例子來說,它的值就是 /etc/hosts

簡單來說這一行 Vim 指令就是透過 shell 以 sudo 執行 tee,取得 Vim 寫入緩衝區的資料,再將其寫入目前的檔案(也就是 %)中。

這個指令是透過外部的 shell 寫入檔案,所以執行完之後,Vim 會發現目前正在編輯的檔案內容有被更動過,就會顯示這樣的警告訊息,請按下 L 重新載入新的檔案內容即可。

警告訊息

參考資料:nixCraft