遠端複製文件除內容之外的所有特徵

遠端複製文件除內容之外的所有特徵

下面描述的所有內容都是透過 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 傳輸常規文件的“外殼”,該文件具有文件的模式、所有者和群組,但忽略 tarball 中的內容。除非有人知道讓 tar 執行此操作的技巧,否則我想我將不得不考慮 tar 以外的其他機制。

我怎樣才能最輕鬆地實現這個目標?

更新#1

我嘗試的一種方法是首先製作文件的臨時副本(使用cp-p以保留我關心的檔案屬性)在遠端系統上,清空該臨時檔案的內容(使用截斷-s 0),然後如上所述使用 tar / ssh 將其複製到我的本機電腦。這是尷尬和不優雅的。我希望找到一種方法來做到這一點,而不需要使用臨時檔案。

答案1

您可以在執行 tar 之前在敏感檔案之上安裝一個空檔案。

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

或類似的東西。

相關內容