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.
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:
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?
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.
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.
Tags bash tar linux shell-script script