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

8

Sempre me perguntei por que rsynctenta 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 de gravação para criar o arquivo de destino real. Isso pode ser simulado mesmo localmente ao tentar copiar um arquivo como usuário comum para / , rsynctransferirá o arquivo inteiro (também demorando muito para arquivos grandes) e finalmente falha com

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

Portanto, ele já parece falhar na inicialização ao tentar criar o arquivo temporário (o arquivo de pontos ) durante a transferência. Por que ele não percebe isso e aborta cedo, em vez de tentar copiar o arquivo inteiro sem ter permissões de gravação?

E para onde ele copia o arquivo, se não puder criar o arquivo temporário? Não consigo ver nenhum aumento de memória dos processos rsync e também nenhum arquivo correspondente em / tmp . Parece que ele descarta diretamente os dados no destino, mas continua com a transferência.

scai
fonte

Respostas:

5

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

Sobre a questão de por que não verifica seus próprios direitos de antemão: ele pode perder algumas especificidades adicionais como ACLs de acesso estendido, para que o rsync não acredite no esquema padrão 3 * 3 + 3. OTOH, essa política intencional não faz nenhuma diferença real no resultado - de qualquer forma, o arquivo não é atualizado.

Netch
fonte
Obrigado pela sua resposta, mas isso é apenas um palpite vago e realmente não responde à minha pergunta. Mesmo com --inplaceele transfere o arquivo inteiro até perceber a falta de permissões de gravação.
Scai
1
Embora isso não responda à ajuda do OP, o uso --inplaceé muito útil quando você tem direitos para gravar em um arquivo, mas não no diretório que o contém.
tokland
mas essa foi a minha solução (eu tinha TMP-arquivos gerados, mas não renomeado para o nome originale), por isso obrigado e até
roothahn
4

Isso parece ser uma falha do atual protocolo rsync, conforme explicado no rastreador de erros . O protocolo rsync não pode determinar antecipadamente se possui permissões de gravação no destino. Em vez disso, envia e verifica o sucesso ou o fracasso posteriormente.

scai
fonte
2

O Rsync cria um arquivo temporário na mesma pasta do arquivo de destino, portanto, nesse caso, você deve copiar alguns arquivos /, pois não o iniciou como raiz e normalmente /era gravável apenas pela raiz, por isso falha.

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

margarida
fonte
1
Eu sei que rsynccria seus arquivos temporários na mesma pasta que o diretório de destino. Mas, mesmo que não consiga criar esses arquivos temporários, o peitoril inicia a transferência e falha depois, em vez de verificar logo no início se todas as permissões de gravação são necessárias. Eu quero saber por que se comporta assim.
scai 12/09/12