Transferir usando o linux ssh e mantendo permissões

2

Eu preciso transferir arquivos pelo ssh para outro servidor. As estruturas de arquivos são idênticas nos dois lados. Eu usei scr -r mas isso não retém as permissões orginal file / dir. O rsync faz o trabalho de manter as permissões intactas, mas não exclui os arquivos no lado do destino, se eu quiser sobrescrevê-los devido a alterações. Eu sei rsync vai escrever as alterações quando os arquivos de origem são mais recentes, mas eu preciso copiar apenas tudo reguardless da data (ou seja, substituir o diretório de destino com o que estou movendo) sem ter que desembolsar para o primeiro destino e excluir manualmente o dir .

Ouvi dizer que o tar pode fazer isso, mas não consigo fazê-lo funcionar sem erros. A sintaxe é

tar -cf - /directory/directory | ssh host.name tar -xf - C /destination_directory

Qualquer ajuda seria apreciada.

    
por jbolt 09.12.2010 / 21:08

2 respostas

2

O rsync pode excluir arquivos no destino usando a sintaxe --delete. Se você deseja que ele substitua um arquivo inteiro por sua implementação de sincronização parcial, tente --whole-file.

Trechos do link :

-W, --whole-file With this option rsync's delta-transfer algorithm is not used and the whole file is sent as-is instead. The transfer may be faster if this option is used when the bandwidth between the source and destination machines is higher than the bandwidth to disk (especially when the "disk" is actually a networked filesystem). This is the default when both the source and destination are specified as local paths, but only if no batch-writing option is in effect.

--delete This tells rsync to delete extraneous files from the receiving side (ones that aren't on the sending side), but only for the directories that are being synchronized. You must have asked rsync to send the whole directory (e.g. "dir" or "dir/") without using a wildcard for the directory's contents (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus gets a request to transfer individual files, not the files' parent directory. Files that are excluded from the transfer are also excluded from being deleted unless you use the --delete-excluded option or mark the rules as only matching on the sending side (see the include/exclude modifiers in the FILTER RULES section).

    
por 09.12.2010 / 21:28
0

Como Eddie apontou, rsync --delete -Ha fará o trabalho para você. Certifique-se de usar a opção --dry-run / -n antes de executá-la para evitar excluir acidentalmente tudo no diretório errado. O Rsync interpreta seus diretórios de maneira diferente, dependendo de você anexar uma barra final (consulte man rsync e procure " trailing "), por isso é fácil fazer as coisas erradas se você não está prestando atenção.

Eu também uso o tar às vezes como você está fazendo. Eu acho que você está simplesmente perdendo um traço antes do C em seu comando acima. Como regra geral, você só pode omitir os traços no primeiro parâmetro. (Mas você também pode usar cd em vez da sintaxe -C desajeitada.) Com o tar no seu lado fonte você está criando um directory/ extra nos nomes de caminho no seu arquivo, então eu cd primeiro no lado da fonte também. O -f - é redundante pelo caminho (o tar usa stdin / stdout por padrão). Então, aqui está o que meus pipers tendem a parecer:

cd /some/dir; tar c my_dir | ssh host 'cd /the/target/dir; rm -rf my_dir; tar x'

Use sudo tar no lado do host para preservar a propriedade ao extrair. (Dica: use cz / xz em vez de c / x para transferência gzipada, ou passe por lzop e lzop -d para compressão em tempo real se você estiver transferindo por cabo Ethernet). / p>     

por 02.01.2011 / 19:12

Tags