CH-J Server ManagerSSH によるサーバー管理
メニュー
すべてのガイドと記事 →

編集中にリモートファイルが変更された場合:上書きを防ぐ方法

編集中にほかの人がサーバー上のファイルを変更したことを検知し、バージョンを比較して双方の変更を失わずに保存する方法を説明します。

問題が起きる仕組み

ファイルを開いて自分のコピーを編集している間に、別の管理者、構成管理の実行、パッケージのアップグレード、アプリケーション自体などが元のファイルに書き込むことがあります。その後で保存すると、エラーも出ずに相手の変更が消えてしまいます。ローカルで編集してSFTPでアップロードする場合は特に危険です。読み取りから書き込みまでの時間が長く、通常のアップロードでは何も比較しないためです。

開始前の状態を記録する

ファイルをダウンロードするときに、チェックサムと最終変更時刻を記録してください。アップロードの直前にもう一度確認します。チェックサムが異なる場合はファイルが変更されているため、内容を確認せずに上書きしてはいけません。

sha256sum /etc/example.conf
stat -c '%y %U %G %a' /etc/example.conf

変更を比較してマージする

編集したコピーを別の名前で残し、現在のバージョンを取得して、編集開始時のバージョンと自分のバージョンの両方と比較します。そのうえで、現在のバージョンを上書きするのではなく、自分の変更をそこに適用します。diff3コマンドでは3つのバージョンをまとめて表示できます。

diff -u example.conf.orig example.conf.current
diff -u example.conf.orig example.conf.mine
diff3 example.conf.mine example.conf.orig example.conf.current

何がファイルを変更しているか調べる

ファイルが繰り返し変更される場合は、再び編集する前に原因を突き止めてください。誰がファイルを開いているかを確認し、journalとパッケージの履歴を調べます。構成管理がそのファイルを管理しているなら、そこでテンプレートを変更してください。そうしないと次の実行で編集内容が置き換えられます。

sudo lsof /etc/example.conf
sudo journalctl --since "1 hour ago" --no-pager | grep example.conf
grep example.conf /var/log/dpkg.log

警告はロックではない

vimやnanoなどのエディターは、開いた後にファイルが変更されると警告しますが、別のプロセスによる書き込みは防ぎません。チェックサムの比較も同じです。保存直前の確認で競合が起きうる時間は非常に短くなりますが、ゼロにはなりません。複数人が作業するサーバーでは、設定の元データをバージョン管理するほうが、どのエディターよりも有効な保護になります。

CH-J Server Managerの保存時の保護

File Managerのエディターは保存時にファイルを再確認します。内容、権限、リンク先が変わっていると保存を中止し、元のファイルはそのまま残ります。その後、サーバーから現在のバージョンを読み込めますが、未保存の変更は破棄されるため、先に自分のテキストを別の場所にコピーしてください。エディターがバージョンをマージすることはありません。転送時には、変更された転送先や既存の転送先を置き換える前にアプリが確認し、転送中に転送元が変更された場合はやり直すよう通知します。

詳しいドキュメント

man: stat →

man: diff →

生体認証によるロック解除とセキュリティ →