CH-J Server Manager透過 SSH 管理伺服器
選單
所有指南與文章 →

編輯期間遠端檔案發生變更:如何避免覆寫

如何偵測編輯期間他人對伺服器檔案所做的變更、比較版本,並在保留雙方變更的情況下儲存。

問題如何發生

開啟檔案後,在你編輯自己副本的期間,其他操作可能會寫入原檔:另一位管理員、一次組態管理作業、套件升級或應用程式本身。此時若儲存,另一方的變更就會消失,而且不會報錯。本機編輯後透過 SFTP 上傳尤其容易遇到這個問題,因為讀取與寫入之間的間隔很長,而一般上傳不會進行任何比較。

開始前記錄檔案狀態

下載檔案時,記下總和檢查碼與最後修改時間。在上傳前立即再次檢查。總和檢查碼不同表示檔案已變更,不應在未檢視的情況下覆寫。

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

比較並合併變更

將編輯後的副本另存為新名稱,取得目前版本,並將其與開始編輯時的版本及你自己的版本比較。接著把你的變更套用到目前版本,而非直接覆寫。diff3 指令可以同時顯示這三個版本。

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

找出是什麼在變更檔案

如果檔案持續變動,應在再次編輯前找出原因。檢查誰開啟了該檔案,並查看日誌與套件歷程紀錄。如果該檔案由組態管理工具管理,應在該工具中修改範本,否則下次執行時就會取代你的變更。

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 →

生物辨識解除鎖定與安全性 →