ルートとしてvim再編集


28

私は頻繁にvimでファイルを開き、いくつかの変更を行い、ファイルを保存するときは読み取り専用です..(別のユーザーが所有しています)。ルートとしてファイルを再度開き、ルートとしてコピーまたは再編集するために最初に一時ファイルに保存せずに変更を保持する方法に関するヒントを探しています。

回答:


42

このstackoverflow回答から、skinpによって

:w !sudo tee %

書き込み権限のないファイルを編集する前に、sudoを忘れることがよくあります。そのファイルを保存してアクセス権エラーが発生した場合、そのvimコマンドを発行するだけで、一時ファイルに保存せずにファイルを保存し、再度コピーすることができます。


それはほとんどそれです..しかし、vimを再起動してrootとして実行しておくといいでしょう。これはこれまでのところ私のお気に入りです:)
rkthkr 09年

@rkthkr、「vimを再起動してrootとして実行」すると、行った編集を保存できず、元に戻す履歴が失われます。しかし、それがあなたが望むものであるならば... [文字を使い果たしました。]私が書いている「答え」を見てください。
ブルーノブロノスキー2009年

2
@dbr、ファイルを上書きした後(ティーをsudoとして)、[O] kまたは[L] oadでプロンプトが表示されることに言及する価値があると思います。後者のオプションでは、元に戻す履歴が消去され、「変更されたフラグ」がリセットされ、変更を保存するように警告されることなく終了できます。私が好む前者のオプションは、元に戻す履歴を保存しますが、終了しようとすると警告が表示されます。:q!を使用する必要があります。この場合は終了します。これを行うと、必要に応じて検証(例:: sudo /etc/init.d/httpd configtest)およびロールバック/再編集が可能になります。
ブルーノブロノスキー2009年

15

これに私を投票しないでください。この答えを実装することはお勧めしませんが、それはrkthkrが求めている答えです。

rkthkr氏:
しかし、vimを再起動してrootとして実行するのは良いことです

これを行う方法は、:!sudo vim %
ipozgajで説明したように、引数としての%(サブ引数も)が現在のバッファーへのパスに置き換えられます。(パスワードの入力を求められる場合があります。)最終的に、rootが所有する新しいvimプロセスになります。これは元のvimプロセスの子プロセスです。間抜けだね?psでは次のようになります。

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

ファイルを含むディレクトリへの書き込み権限があり、そのファイルを編集した場合、スワップファイルが終了するという警告が表示される場合があります。[R] ecoverを選択すると、親vimプロセスによって行われた変更のほとんどが反映されます。(*スワップの更新はタイミングがとられているか、デルタのしきい値を持っていると思います。すでにこれに時間を費やしすぎているので、調査する気にはなりません。)まだvimで... 2番目のvimプロセスを開きました。覚えてる?

さて、すべてのことを言って...私はこれを行うことはほとんどありません。たぶん、コーヒーが足りなかったり、コーヒーの量が少なかったので、ルートとしてさらにいくつかのファイルを編集する必要があることに気づいたら...これを試してみるかもしれません。システム管理の14年間で、私は決して経験しませんでした。しかし、私の希望するソリューション(dbrが提供するとおり)に不満を表明するまで、私はこれについて考えたことはありませんでした。


リチャードありがとう!非常に有益な、私はあなたのために+1を与える:)
rkthkr 09年

これは非常に質の高い答えです。なぜ投票するのですか?私からも+1。
メイ

1
@Richard Bronoskyに感謝します。私のgvimでは、sudoパスワードを入力する:w !sudo tee %ことはできないので、これは良い答えだと思います。
エリックフォーティス

1

私は通常、それを$ HOME / tmp / apache.confの一時ファイルに保存します(たとえば)

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

これは、変更をマージするための余分な作業ですが、成果がありました。利便性と望ましくない変更に対する測定との間の良い方法であることがわかりました

それ以前は、ACLを考えたり、対応するグループをファイルに割り当てたりしていましたが、ほとんどの場合うまくいきませんでした。所有権を変更するのを忘れたか、そうしないつもりでファイルを変更していました。

これは、現在まで管理されていないファイルにのみ当てはまります。使用する全体的なソリューションは、人々がローカルでファイルを編集し、適切なサーバーで変更をテストするgitリポジトリを備えたpuppetです。


0

私が通常行うことは、必ずしも最速というわけではありませんが、確かに安全ですが、次のようなことをすることです(例としてnsswitch.confを使用):

:w! ~/%

vimを終了し、次を実行します。

sudo vim nsswitch.conf
1GdG
:r ~/%

これにより、すべての行が削除され、変更および更新されたバージョンが読み込まれ、その場所で編集されます。ホームディレクトリを使用すると、アクセス権があるかどうかを考える必要がなくなり、/ tmpよりもプライベートになります。これはファイル全体の置換であることに注意してください。すべての変更を追加したくない場合は、選択する必要があります。

これらの回答のいずれかに頭痛が伴うにもかかわらず、変更を失う理由はありません。

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