web-dev-qa-db-ja.com

Vimの内部からrootになる

時々、Vimを使用して/etcの構成ファイルの編集を開始しますが、Sudoを使用してVimを開始するのを忘れています。その場合、避けられない結果として、編集を終えた後、ファイルを保存する権限がないという恐ろしい通知に遭遇します。

ほとんどの場合、編集は十分に小さいので、Vimを終了し、すべてをrootとして再度実行します。もちろん、書き込み可能な場所に保存してからrootとしてコピーすることもできますが、これもやや面倒です。

しかし、変更を破棄せずに、Vim内からrootになるかSudoを使用する簡単な方法があると確信しています。メソッドがSudoに依存していない場合は、ユーザーのために設定されているほうがさらに便利です。

72
Mad Scientist

Sudoは既存のプロセスの有効なユーザーを変更できません。常に、昇格された特権を持つ新しいプロセスを作成し、元のシェルは影響を受けません。これはUNIX設計の基本です。ほとんどの場合、回避策としてファイルを/ tmpに保存します。本当に直接保存したい場合は、Vimの機能を使用して、ファイルを別のプロセスにパイプすることができます。次のコマンドで保存してみてください:

:w !Sudo dd of=%

テストされ、動作します。 Vimはファイルをリロードするように求めてきますが、それは不要です。 o 元に戻す履歴を再読み込みして失わないようにするためです。これをVimコマンド/関数に保存したり、キーにバインドして簡単にアクセスしたりすることもできますが、それは読者への演習として残しておきます。

47
penguin359

ルートとしてファイルを保存します。

:w!須藤ティー%

37
plaes

ルートとしてファイルを編集するには、sudoeditを呼び出します。

vimを直接呼び出すときの不便さは、潜在的に危険なことをするのにあまりにもカジュアルすぎるという警告として考えてください。

これを.vimrcに入れることができます

cmap w!! %!Sudo tee > /dev/null %

:w!!を実行してトリガーします。ファイルはSudo teeを介して現在のファイル名(%)にプッシュされます。

https://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks ;で削除された投稿から参照: https://stackoverflow.com/questions/1218390/what-is-your-most-productive-shortcut-with-vim

8
Hamish Downer

これもうまくいきます:

:w !Sudo sh -c "cat > %"

これは、この answer の@Nathan Longのコメントに触発されています。

[〜#〜]通知[〜#〜]

"の代わりに'を使用する必要があります。シェルに渡す前に%を展開する必要があるためです。

3
feihu