権限なしで開いたときにvimを使用してファイルを強制的に編集する


51

vimを使用してファイルを編集します。時々、適切な許可を忘れてしまいます。vimとファイルを読み取り専用ファイルとして実行します。変更を加えることはできますが、実際に変更を書き込むことはできません。時々ファイルを開いて変更を加えますが、sudoで実行せず、自分自身に叫び、その後強制的に終了して、rootユーザーとして再び開きます。

これに対する回避策はありますか?ファイルの読み取り専用ステータスにもかかわらず、ファイルに強制的に変更を加えることはできますか?少なくとも変更を保存し、diffを実行し、ファイルをマージできますか?


3
:この質問はすでにここに回答されているようだstackoverflow.com/questions/1005/...を
秋の

謝罪いたします。私はその反応を見つけられませんでした。ありがとうございました。
andorケッセルマン

3
ワットsudoのティー%[1]:[sudoのトリックとVimの書き込み] [1]を使用してください!stackoverflow.com/questions/2600783/...
マティアス・アスルンド

回答:


81

現在の問題に応じて、いくつかの異なるアプローチがあるようです。

  1. viによる読み取り専用。ファイルに:set readonlyあなたができるなら
    • 使用:w!して書き込みを強制する、または
    • 発行して:set noreadonlyから、通常の:w
  2. 許可問題(須藤):あなたが書くことはできませんが、あなたはsudoの権限を持っています。
    • 問題::w !sudo tee %。これは、パイプ情報teeを受け取り、ファイルに書き込むことができるコマンドにバッファを書き込みます。また、ティーがsudo powersで実行されると、ティーはファイルを変更できます。
  3. 許可問題(なしsudoの):あなたは、ファイルを書き込むための権限を持っていない、あなたは管理者のアクセス権を持っていません。
    • を使用:w! ~/tempfile.extして、変更を一時ファイルに書き込んでから、一時ファイルをディレクトリに移動する手段を講じます(一時ファイルをディレクトリの所有者/管理者に送信します)。

詳細については、こちらをご覧ください。

  1. StackOverflowから
  2. Geekyboyから
  3. データハラタケから

ショートカット

それは多くの場合、問題の#2(あるとして許可に関する問題、sudoの)、あなたはあなたのためにすることができます/etc/vim/vimrc(または~/.vimrc)次のショートカット:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

次に:w!!sudo powers を使用して保存するだけで入力できます。ここでは説明しませんが、上記の参考文献には多くのショートカットが含まれています。


1
そして、あなたのような匿名で、ネクロマンサーバッジを獲得しました!ありがとう!私は今モルドールを守る気がします。;)
ベコ博士

5

これを行うには2つの方法が考えられます。

最初の方法は、ユーザーがファイルを所有していることを前提としていますが、ファイルは読み取り専用です。

書き込みコマンドにviの感嘆符の接尾辞(:w!)を使用して、独自のREADONLYファイルを強制的に上書きするだけです。もちろん、これは、現在のフォルダーに書き込みおよび実行する権限があることを前提としています。

:w!

viは元のREADONLYファイルを上書きします。

2番目の方法は、他の誰かがファイルを所有しており、そのファイルへの変更を保存することを想定しています。

これを達成する1つの方法は、vi内から元のファイルに加えられた変更をedスクリプトとして保存することです。このedスクリプトは、ed行エディターを使用して、vi以外で後で元のファイル(または他の同様のファイル)に適用できます。

現在の編集セッションをedスクリプトとして保存する方法は、元のファイル名と編集されたviバッファーを、-edコマンドラインスイッチを使用して標準ユーティリティとしてdiffユーティリティに渡すことです。

そのため、編集済みのviバッファーを想定して、以下を実行します

:.,$!diff --ed [original_file] -

これにより、現在のバッファー(。、$!)のすべての行が、元のファイルを現在のバッファーの内容に変換するために必要なdiffで生成されたedスクリプト(diff --ed [original_file]-)に置き換えられます。次に、このedスクリプトを安全な場所に保存し、書き込み可能な元のファイルのバージョンにスクリプトを適用します。したがって、スクリプトを書き込み可能な場所、たとえばログインフォルダーに保存します。

:w ~/my_ed_script

viを終了し、このedスクリプトを使用して、最初に保存できなかった編集済みファイルを取得します。bashコマンドラインプロンプト「$」からこれを実現する方法を次に示します。

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

このコマンドシーケンスが言葉で行うことは、diffで生成したスクリプトを連結し、ed書き込みコマンド「w」をedの標準入力にエコーすることです。Edは、このスクリプトを元のファイルの書き込み可能なコピーに適用し、変更されたバッファーの変更をファイルに書き戻します。

これは、viで実行された作業を、もともとvi、diff、およびedを使用して他の誰かが所有していたファイルに保存する方法です。


1

ファイルの書き込み許可がない場合だけをカバーしたいです。

:!chmod +w %
:w!

その間に、vimはファイルの変更について文句を言います(フラグが変更されるため)-それらを無視することは明らかに安全です


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