Cópia remota de todas as características de um arquivo, exceto pelo seu conteúdo

0

Tudo descrito abaixo é feito por meio de um script Bash.

Desejo capturar o estado de um conjunto definido de arquivos em um conjunto definido de hosts remotos. O "estado" de um arquivo depende do tipo de arquivo:

  • Arquivo normal: caminho completo, conteúdo do arquivo, modo, proprietário, grupo
  • Link simbólico: caminho completo do próprio link, o caminho apontado, modo (sempre 777), proprietário, grupo
  • Diretório: caminho completo, modo, proprietário, grupo

Ao criar um arquivo local para representar o estado de um arquivo remoto, distingo entre arquivos com o mesmo caminho completo, mas que diferem em hosts diferentes, acrescentando ao nome de arquivo local um hash dos caracteres listados acima. Eu então tar o arquivo remoto para cima (não recursivamente, de modo que, no caso de um diretório, eu obtém apenas o diretório), canalizo-o embora SSH, descompacte-o para minha máquina local e mv para o nome do arquivo com um hash anexado. Eu uso alcatrão porque preserva as características que me interessam.

HASH=$(ssh -n "$ONE_HOST" "{ cat $ONE_FILE_PATH; stat -c \"%a %u %g %F\" $ONE_FILE_PATH; } | sha512sum")
ONE_HASH=${ONE_HASH:0:20}

TARGET_FILENAME_FOR_COPY="$FILENAME"."$ONE_HASH"
TARGET_PATH_FOR_COPY="$TARGET_DIRECTORY_FOR_COPY"/"$TARGET_FILENAME_FOR_COPY"

ssh -n "$ONE_HOST" \
     "tar -C $DIRECTORY --no-recursion -cf - $FILENAME" | \
     tar -xf - -C "$TARGET_DIRECTORY_FOR_COPY"

mv "$TARGET_PATH_UNHASHED" "$TARGET_PATH_FOR_COPY"

Tudo isso está funcionando e funcionando.

Agora, no caso de arquivos regulares , tenho uma necessidade adicional de lidar com arquivos confidenciais cujo conteúdo não desejo copiar (embora o conteúdo continue sendo representado no hash) . Meu objetivo é criar exatamente o mesmo arquivo local que eu faria no processo descrito acima, mas que o arquivo deve estar vazio em vez de conter o conteúdo do arquivo remoto.

Nota: não consigo copiar o arquivo e depois esvaziar a cópia do conteúdo. Sendo um arquivo confidencial, seu conteúdo não deve ser transferido pela rede.

Não conheço uma maneira de obter tar para transferir um "shell" de um arquivo regular que possui o modo, o proprietário e o grupo do arquivo, mas omite o conteúdo no tarball. A menos que alguém saiba de um truque para fazer o tar fazer isso, acho que vou ter que olhar para algum outro mecanismo além do tar.

Como posso mais facilmente realizar isso?

UPDATE # 1

Uma abordagem que estou tentando é primeiro fazer uma cópia temporária do arquivo (usando cp -p para preservar os atributos de arquivo que me interessam) no sistema remoto, esvaziar esse arquivo temporário de conteúdo (com truncate -s 0 ) e copie-o para minha máquina local com tar / ssh conforme descrito acima. Isso é estranho e deselegante. Espero encontrar uma maneira de fazer isso sem recorrer ao uso de um arquivo temporário.

    
por Dave 09.03.2018 / 18:39

1 resposta

0

Você pode montar um arquivo vazio sobre os arquivos confidenciais antes de executar o tar.

touch /tmp/emptyfile
mount --bind /tmp/emptyfile /home/user/.ssh/id_rsa

Ou algo semelhante.

    
por 09.03.2018 / 19:53