書き込み権限がないファイルを保存する方法は?


26

時々、ファイルを開いて、自分のユーザーとして、[read-only]ステータス行の警告に気付かないか、「忘れる」ことなく、いくつかの変更を加えることがあります(例:の/etcようなランダムな構成ファイル/etc/resolv.conf)。

:w!私のユーザーには書き込み権限がないため、この場合は明らかに失敗します。だから:w /home/filename、終了しsudo mv ...、非常に不快でなければなりません。

現在開いているファイルを保存できるように一時的にルートにエスカレーションする方法はありますか?(私がいるsudoers/またはsu直接できる場合)?

回答:


24

トリックは、外部呼び出しを使用することsudoです:

:w !sudo tee %

仕組み:

  • :w !<command><command>バッファの内容を標準入力として実行します。
  • teestdinをファイルとstdoutに複製します。%現在のファイル名に展開します。
  • sudoルート許可のためにこれに接頭辞を付けます。

あなたがいない実際のVimでファイルを保存し、むしろ、あなたが編集しているファイルの内容を上書きする外部プログラムを呼び出しています。これがVimから警告を受け取る理由です:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

これを関数に変えることができます:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

キーバインド:

nnoremap <Leader>w! :call SuperWrite()<CR>

ではsu、rootユーザーのみが使用することができ-c、すぐにコマンドを実行します。あなたがsuこれを行うために使用できるとは思わないが、おそらく私が知らないトリックがある...


SuperWrite動作しますが、ファイルがエコーされます。実行:silentすると、パスワードが目に見えないように入力されます。
TankorSmash

@TankorSmashありがとう。回答を更新しました。ただし、「パスワードを目に見えないように入力する」という意味がわかりませんか?追加してもsilentうまくいくようですか?
マーティントゥルノイ

私はvimをsudoで実行していないので、ここで問題になるかもしれませんが、ファイルをsudo teeに移動すると、sudoパスワードの入力を求められます。サイレントモードの場合、プロンプトは表示されませんが、パスワードを入力する必要があります。
TankorSmash

1
表示されているのは、指定されたファイルだけでなく、stdoutにエコーするteeの標準機能です。解決策はstdoutを/ dev / nullにリダイレクトすることです: w ! tee % > /dev/null これはコマンドの結果(1行)をエコーし​​ますが、バッファーの内容全体はエコーしません。
ジョンカーター

tee出力を使用してから捨てるのではなくcat、ファイルを印刷したくない場合にも機能しませんか?
ライライアン

12

私は.vimrcで次のマッピングを使用しています。

cnoremap w!! w !sudo tee %

覚えやすいのwは、「書き込み」w!、「強制書き込み」、w!!「超過酷な書き込み」だからです。:P


1
私はそれを長い間マップしてきましWw!!が、もっと意味があり、私の.vimrcを更新します。ありがとう
-jalanb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.