CH-J Server Managergerenciamento de servidor sobre SSH
E-mail
Todos os guias e artigos →

Um ficheiro remoto mudou enquanto o editava: como evitar substituí-lo

Como detetar que outra pessoa alterou um ficheiro no servidor durante a sua edição, comparar versões e guardar sem perder nenhuma das alterações.

Como surge o problema

Abre um ficheiro e, enquanto edita a sua cópia, algo escreve no original: outro administrador, uma execução da gestão de configuração, uma atualização de pacote ou a própria aplicação. Se guardar em seguida, a outra alteração desaparece sem erro. A edição local seguida do envio por SFTP está particularmente exposta, porque o intervalo entre a leitura e a escrita é longo e um simples envio não faz qualquer comparação.

Registe o estado antes de começar

Anote a soma de verificação e a hora da última alteração quando transferir o ficheiro do servidor. Verifique-as novamente imediatamente antes de o enviar. Uma soma de verificação diferente significa que o ficheiro mudou e não deve ser substituído sem análise.

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

Compare e una as alterações

Conserve a sua cópia editada com um nome novo, obtenha a versão atual e compare-a com a versão de partida e com a sua. Depois aplique a sua alteração à versão atual em vez de a substituir. O comando diff3 pode mostrar as três versões em conjunto.

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

Descubra o que está a alterar o ficheiro

Se o ficheiro mudar continuamente, identifique a origem antes de voltar a editá-lo. Verifique quem o tem aberto e consulte o journal e o histórico de pacotes. Se o ficheiro for controlado pela gestão de configuração, altere o modelo nesse sistema; caso contrário, a próxima execução substituirá a sua edição.

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

Um aviso não é um bloqueio

Editores como vim e nano avisam quando um ficheiro mudou desde que foi aberto, mas não impedem outro processo de escrever nele. O mesmo se aplica à comparação de somas de verificação: uma verificação imediatamente antes de guardar torna o intervalo de risco muito curto, mas não o elimina. Em servidores onde trabalham várias pessoas, uma fonte de configuração sob controlo de versões oferece melhor proteção do que qualquer editor.

Proteção ao guardar no CH-J Server Manager

O editor do File Manager volta a verificar o ficheiro ao guardar. Se o conteúdo, as permissões ou o destino da ligação tiverem mudado, a gravação é interrompida e o original permanece como está. Pode então carregar a versão atual do servidor, mas isso descarta as alterações não guardadas, pelo que deve copiar primeiro o seu texto para outro local. O editor não une as versões por si. Nas transferências, a aplicação pede confirmação antes de substituir um destino que mudou ou que já existe, e indica que deve recomeçar se a origem tiver mudado durante a transferência.

Documentação detalhada

man: stat →

man: diff →

Desbloqueio biométrico e segurança →