Vimの内部からルートになる


72

時々/etc、Vim を使用して設定ファイルの編集を開始しますが、Vimのsudo起動に使用することを忘れています。避けられない結果は、編集を終了した後、ファイルを保存する権限がないという恐ろしい通知に遭遇することです。

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

しかしsudo、変更を破棄することなく、Vimの内部からrootになるか使用する簡単な方法があると確信しています。メソッドがsudoユーザー用に設定されていることに依存しない場合は、さらに良いでしょう。


1
すべての管理者編集sudoeditvimはなく、使用する習慣になりました。これはもうこの問題に遭遇しない方法の1つです。ジルの答え +1 。
jw013

SOからのこれらの代替Q&Aは役に立つので、ここにリンクします:vi内のファイルのルート権限を取得しますか?vim「write with sudo」トリックはどのように機能しますか?
slm

回答:


46

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

:w !sudo dd of=%

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


2
これは興味深い解決策ですが、パスを%に置き換えることができます。これは、vimで現在編集中のファイルのパスになります。
リード

%ファイル名にスペースが含まれる場合は、引用符で囲む必要があります。
直観

また、これは'modified'設定をリセットしません。あなたは手動でそれを行うことができますset nomodified
直観

2
あなたは本当に慎重になりたい場合は、実際に、あなたがすべきexec 'w !sudo dd of=' . shellescape(expand('%'))場合には、ファイル名は引用符、バックスラッシュ、ドル看板などが含まれています
直感

それはCommandlinefu-plaesによるコマンドとどう違うのですか?

36

ファイルをルートとして保存する:

:w!sudo tee%


13

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

vim直接電話するときの不便さは、危険を伴う可能性のあることを行うにはあまりにも気楽すぎるという警告として考えてください。



3

これもうまくいきます:

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

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

通知

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.