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 →

Биометрическое разблокирование и безопасность →