Copia remota de todos los rasgos de un archivo excepto su contenido

Copia remota de todos los rasgos de un archivo excepto su contenido

Todo lo que se describe a continuación se realiza mediante un script Bash.

Deseo capturar el estado de un conjunto definido de archivos en un conjunto definido de hosts remotos. El "estado" de un archivo depende del tipo de archivo:

  • Archivo normal: ruta completa, contenido del archivo, modo, propietario, grupo
  • Enlace simbólico: ruta completa del enlace en sí, ruta apuntada, modo (siempre 777), propietario, grupo
  • Directorio: ruta completa, modo, propietario, grupo

Al crear un archivo local para representar el estado de un archivo remoto, distingo entre archivos con la misma ruta completa pero que difieren en diferentes hosts agregando al nombre del archivo local un hash de las características enumeradas anteriormente. Luego cargo el archivo remoto (de forma no recursiva, de modo que, en el caso de un directorio, obtengojustoel directorio), canalícelo a través de SSH, descomprímalo en mi máquina local y transmítalo al nombre de archivo con un hash adjunto. Utilizo alquitrán porque conserva los rasgos que me importan.

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"

Todo esto está en su lugar y funcionando.

Ahora bien, para el caso dearchivos regulares, tengo una necesidad adicional de manejar archivos confidenciales cuyo contenido no deseo copiar (aunque el contenido seguirá representado en el hash). Mi objetivo es crear exactamente el mismo archivo local que crearía en el proceso descrito anteriormente, pero que el archivo debería estar vacío en lugar de contener el contenido del archivo remoto.

Nota: No puedo copiar el archivo y luego vaciar la copia del contenido. Al ser un archivo sensible, su contenido no debe transferirse a través de la red.

No conozco una manera de hacer que tar transfiera un "shell" de un archivo normal que tenga el modo, propietario y grupo del archivo pero omita el contenido en el archivo tar. A menos que alguien conozca un truco para conseguir que tar haga esto, creo que tendré que buscar algún mecanismo distinto al tar.

¿Cómo puedo lograr esto más fácilmente?

ACTUALIZACIÓN #1

Un enfoque que estoy intentando es hacer primero una copia temporal del archivo (usandocp-ppara preservar los atributos del archivo que me interesan) en el sistema remoto, vacíe ese archivo temporal de contenido (contruncar -s 0), y luego copiarlo a mi máquina local con tar/ssh como se describe arriba. Esto es incómodo y poco elegante. Espero encontrar una manera de hacer esto sin recurrir al uso de un archivo temporal.

Respuesta1

Puede montar un archivo vacío encima de los archivos confidenciales antes de ejecutar tar.

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

O algo similar.

información relacionada