web-dev-qa-db-ja.com

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)を使用して、1つのルートファイルと1つの非ルートファイルをvimdiffする方法はありますか?

2
Sparhawk

そのsudoeditエラーメッセージに関連して役立つ場合があります。

sudoedit:...書き込み可能なディレクトリ内のファイルの編集は許可されていません

Sudo visudoを使用してsudoersファイルを変更してみて、次の行を追加してください。

Defaults  !sudoedit_checkdir

もっと ここ

3
ajaaskel

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
    
  • sudoeditはすべてのSudo以外の引数のファイル名を処理するため、ラッパースクリプトを使用できます。

    $ 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
    
2
muru