2012年8月30日 星期四

sudo vim WTF

  一直想著網誌要寫什麼, 又擔心寫出很沒水準的東西, 就一直不敢寫, 一直拖。 所以我還是下定決心從沒水準的內容開始寫了 XD... 請有在看的人先多多見諒一下讓我熱熱身。

進入正題.

  vim 一直是 console 愛用者的編輯器之一 (還有 emacs), 但當他碰上 sudo 的時候, 由於 sudo 會將 euid, egid, 和大量環境變數改為 superuser 或是指定的其他使用者,而讓自己辛辛苦苦做出來的 .vimrc 失效。在 Google 上兜了兩圈後發現幾種解法,自己試用了一下,留個紀錄也給大家做參考。

方法一:
  在 Brablc.com blog 中找到的,利用 bash 的 Alias 加上 ${SUDO_USER} 的 .vimrc 路徑來使用。

if [ -n "${SUDO_USER}" -a -d "/home/${SUDO_USER}/.vim" ]; then
alias vim="/usr/bin/vim --cmd \"set runtimepath+=/home/${SUDO_USER}/.vim\" -u /home/${SUDO_USER}/.vimrc"
fi


但這個做法缺點是沒有處理到全部的環境變數,已知會和 neocomplcache.vim 插件產生衝突顯示下列訊息:

"sudo vim" and $HOME is not same to /root are detected.Please use sudo.vim plugin instead of sudo comm
and or set always_set_home in sudoers.





方法二:

  使用 VIM 插件: sudo.vim ,這個插件提供 CLI 和在 VIM內時的操作方式。可惜使用上並不是相當方便,例如筆者自己救覺得 LI 時要多打那個冒號救覺得不太舒服。另外在測試中也發現到若編輯不存在的檔案時,會沒有寫入的權限,這也是相當嚴重的問題。

(command line): vim sudo:/etc/passwd
(within vim):   :e sudo:/etc/passwd


方法三:
  就打 sudoedit (sudo -e) 吧!一個相當簡單的做法。實現方法是編輯檔案時,會先產生一個暫存檔,讓使用者可以用自己的環境來進行編輯。當暫存檔發生了改變,例如存檔時,會用sudo 將該檔案複製到原本指定的位置,並移除暫存檔。至於怎麼決定要用哪個編輯器則是依照順序看 SUDO_EDITOR、VISUAL 和 EDITOR,若都沒指定最後會去找 sudoers 內的設定。

sudoedit /etc/fstab


  目前看起來方法三好像沒什麼大問題,繼續試用中。但是正在試圖想要可以 alias 'sudo vim', Bash 可以用寫 function 的方式來達成,但目前使用的 tcsh 就還要研究研究囉。

2 則留言:

  1. 感謝分享,沒想到可以用sudoedit來改。

    回覆刪除
  2. 另一個方法是, 執行visudo加入以下這行, 讓sudo後所有環境變數重設,
    只保留HOME這個環境變數不變, 這樣.vimrc和.vim都參照得到了.

    Defaults env_keep += HOME

    回覆刪除

部落格是發表個人言論的地方,歡迎您給留言來進行討論與給予指教,但也希望您以理性開放的態度來看待文章內容,如果我也會尊重您的留言一般。謝謝