rsync e permissões de gravação no destino

8

Sempre me perguntei por que rsync tenta transferir um arquivo para um local remoto onde ele tem permissões de leitura / execução para o diretório de destino, mas nenhuma permissão escreve crie o arquivo de destino real. Isso pode ser simulado mesmo localmente ao tentar copiar um arquivo como um usuário comum para / , rsync irá transferir o arquivo inteiro (também demorando bastante para arquivos grandes) e finalmente falhará com

rsync: mkstemp "/.myTargetFile" failed: Permission denied (13)

Portanto, parece que falha na inicialização ao tentar criar o arquivo temporário (o ponto -file) durante a transferência. Por que não percebe isso e aborta cedo em vez de tentar copiar o arquivo inteiro sem ter nenhuma permissão de gravação?

E onde copiar o arquivo para se ele não pode criar o arquivo temporário? Não consigo ver nenhum aumento de memória nos processos de rsync e também nenhum arquivo correspondente em / tmp . Parece que ele descarta diretamente os dados no destino, mas ainda continua transferindo.

    
por scai 31.08.2012 / 10:21

3 respostas

4

Esta parece ser uma falha do protocolo rsync atual, conforme explicado no rastreador de bugs . O protocolo rsync não pode determinar de antemão se possui permissões de gravação no destino. Em vez disso, envia e verifica se há sucesso ou falha depois.

    
por 23.11.2012 / 11:10
5

Se você precisar copiar em um diretório sem permissão de gravação, adicione --inplace às opções de comando. Às vezes, isso é mais barato do que não criar uma cópia temporária, mas durante a atualização, o arquivo está em estado inconsistente.

Na pergunta por que ele não verifica seus próprios direitos de antemão: ele pode perder alguns detalhes adicionais como ACLs de acesso estendido, portanto, o rsync não acredita no esquema 3 * 3 + 3 padrão. OTOH esta política intencional não faz qualquer diferença real no resultado - de qualquer maneira o arquivo não é atualizado.

    
por 11.11.2012 / 14:36
2

O Rsync cria um arquivo temporário na mesma pasta do arquivo de destino, portanto, neste caso, você deve copiar alguns arquivos para / , já que você não o iniciou como root e normalmente / era gravável apenas por root, então ele falha.

Para descobrir quais arquivos estão sendo copiados, passe o parâmetro -v

    
por 12.09.2012 / 12:04