vimdiffを使用すると、書き込み可能なディレクトリのファイルをsudoeditできますか?

vimdiffを使用すると、書き込み可能なディレクトリのファイルをsudoeditできますか?

ルートファイルが必要な場合は、vimdiff次のエイリアスを使用します。この提案

alias sudovimdiff='SUDO_EDITOR=vimdiff sudoedit'

その後、次のコマンドを使用できます。

$ sudovimdiff /root/a /root/b

しかし、私のユーザーがファイルの1つを書き込めば、コマンドは失敗します。

$ sudovimdiff /root/a /tmp/b
sudoedit: /tmp/b: editing files in a writable directory is not permitted

sudoedit自分の環境設定(つまり)を使用してルートファイルと非ルートファイルをvimdiffする方法はありますか?

答え1

役に立つかもしれないsudoeditエラーメッセージに関連して:

sudoedit:...書き込み可能なディレクトリのファイル編集を許可しません。

sudo visudo次の行を追加してsudoersファイルを修正してみてください。

Defaults  !sudoedit_checkdir

もっとここ

答え2

~からman sudo、説明セクション-e(別名sudoedit):

 To help prevent the editing of unauthorized files, the
 following restrictions are enforced unless explicitly allowed
 by the security policy:

 ·   Symbolic links may not be edited (version 1.8.15 and
     higher).

 ·   Symbolic links along the path to be edited are not
     followed when the parent directory is writable by the
     invoking user unless that user is root (version 1.8.16
     and higher).
 ·   Files located in a directory that is writable by the
     invoking user may not be edited unless that user is root
     (version 1.8.16 and higher).

したがって、次のいずれかを実行してください。

  • 私たちはsudoeditそれをルートと呼びますが、これは目的を崩したり、
  • ユーザーが編集できない新しいディレクトリにユーザーのファイルをコピーします。

    mkdir /tmp/foo
    cp /tmp/b /tmp/foo
    chmod a-w /tmp/foo
    sudoedit /root/a /tmp/foo/b
    
  • ルートファイルを編集して内部で比較します。

    sudoedit /root/a
    # in Vim
    :vert diffsplit /tmp/b
    
  • sudo以外のすべてのパラメータファイル名が処理されるため、sudoeditラッパースクリプトを使用できます。

    $ cat foo.sh
    #! /bin/sh
    exec vimdiff "$@" "$DIFF_FILE"
    
    $ SUDO_EDITOR ="$PWD/foo.sh" DIFF_FILE="$PWD/.zshrc" sudoedit /etc/zsh/zshrc
    [sudo] password for muru:
    2 files to edit
    sudoedit: /etc/zsh/zshrc unchanged
    

関連情報