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 →

生物识别解锁与安全 →