web-dev-qa-db-ja.com

Sudoedit Vim強制書き込み(更新)終了せずに

私はVimでスクリプトを作成していて、sudoeditを使い始めたところです。

問題は、私が:w一時ファイルに書き込むため、エディターを終了しない限り、スクリプトのテストは実行できません。

オリジナルの更新を強制するにはどうすればよいですか、またはsudoeditのポイントが欠落していますか?

4
Ben

sudoeditを使用すると、独自のユーザーIDで実行されているエディターを使用してファイルを編集できます。ファイルを一時ファイルにコピーし、エディターが書き込めるようにします。エディタを閉じるとすぐに、編集したファイルがコピーされます。

エディターの実行中に変更を自動的に書き戻す組み込みの可能性はありません。

だからあなたはどちらかが必要です

  • 他のユーザーIDでエディターを実行します(例:Sudo vi /file/to/edit
  • ファイルを手動で(別の)シェル(Sudo cp /tmp/... /file/to/edit)にコピーするか、vim :!Sudo cp % /file/to/edit内からコピーします。 vimから、:shでシェルを開始するか、Ctrl + Zでvimをバックグラウンドに置いてfgで復元することもできます。
  • 使用 https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-Sudo-trick-work
  • 一時ファイルが変更されるとすぐに変更を書き戻す独自のバージョンのsudoeditを作成します。これは、いくつかのスクリプトで簡単に実行できるはずです。 Inotifyは、変更を検出するのに役立ちます(たとえば、 bashスクリプトをファイルにフックできますか? を参照してください)
10
jofel

あなたはsudoeditのポイントを逃していますが、マニュアルはそれを説明していないので心配しないでください。

ほとんどのエディターには、シェルエスケープがあります(例::Shell in vimを使用すると、Sudoでそのような権限がない場合でも、ルートシェルを取得できます。これは「特権昇格」と呼ばれ、悪いことです。

sudoeditコマンドは、次と同等の機能を実行します。

# cp source-file /tmp/some-temporary-name
$ ${EDITOR} /tmp/some-temporary-name
# cp /tmp/some-temporary-name source-file
# rm /tmp/some-temporary-name

エディターはrootではなくユーザーとして実行されるため、特権の昇格にエディターを使用できないことに注意してください。

非常に寛容なSudo権限を持っている場合(ディストリビューションによってはシングルユーザーマシンでよくあることですが)、次のことができます。

$ Sudo vim source-file

必要な動作を取得します。

5
msw