远程复制文件除内容之外的所有特征

远程复制文件除内容之外的所有特征

下面描述的一切都是通过 Bash 脚本完成的。

我希望捕获一组定义的远程主机上的一组定义的文件的状态。文件的“状态”取决于文件的类型:

  • 常规文件:完整路径、文件内容、模式、所有者、组
  • 符号链接:链接本身的完整路径、指向的路径、模式(始终为 777)、所有者、组
  • 目录:完整路径、模式、所有者、组

当创建一个本地文件来表示远程文件的状态时,我会通过在本地文件名后附加上面列出的特征的哈希值来区分具有相同完整路径但在不同主机上不同的文件。然后我将远程文件打包(非递归,因此在目录的情况下,我得到只是目录),通过 SSH 管道传输,将其解压到我的本地机器,然后将其 mv 为附加哈希值的文件名。我使用 tar 是因为它保留了我关心的特征。

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"

一切已到位并正常运行。

现在,对于常规文件,我还需要处理那些我不想复制其内容的敏感文件(尽管内容仍会继续显示在哈希中)。我的目标是创建与上述过程中完全相同的本地文件,但该文件应为空,而不是包含远程文件的内容。

注意:我不能复制文件然后清空内容副本。作为敏感文件,其内容不能通过网络传输。

我不知道如何让 tar 传输常规文件的“shell”,该文件具有文件的模式、所有者和组,但忽略了 tarball 中的内容。除非有人知道让 tar 执行此操作的技巧,否则我想我必须研究 tar 以外的其他机制。

我怎样才能最轻松地实现这一目标?

更新 #1

我正在尝试的一种方法是首先创建该文件的临时副本(使用cp-p以保留我关心的文件属性)在远程系统上,清空该临时文件的内容(使用截断 -s 0),然后使用 tar / ssh 将其复制到我的本地计算机,如上所述。这很尴尬,也不雅致。我希望找到一种方法来做到这一点,而无需使用临时文件。

答案1

您可以在运行 tar 之前在敏感文件顶部安装一个空文件。

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

或者类似的东西。

相关内容