내용을 제외한 파일의 모든 특성에 대한 원격 복사

내용을 제외한 파일의 모든 특성에 대한 원격 복사

아래 설명된 모든 작업은 Bash 스크립트를 통해 수행됩니다.

정의된 원격 호스트 세트에서 정의된 파일 세트의 상태를 캡처하고 싶습니다. 파일의 "상태"는 파일 유형에 따라 다릅니다.

  • 일반 파일: 전체 경로, 파일 내용, 모드, 소유자, 그룹
  • 심볼릭 링크: 링크 자체의 전체 경로, 가리키는 경로, 모드(항상 777), 소유자, 그룹
  • 디렉터리: 전체 경로, 모드, 소유자, 그룹

원격 파일의 상태를 나타내기 위해 로컬 파일을 생성할 때 위에 나열된 특성의 해시를 로컬 파일 이름에 추가하여 전체 경로가 동일하지만 호스트마다 다른 파일을 구별합니다. 그런 다음 원격 파일을 비재귀적으로 tar 파일로 압축합니다. 따라서 디렉토리의 경우 다음과 같은 결과를 얻습니다.단지디렉터리), 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"

이 모든 것이 제자리에 있고 작동 중입니다.

이제 다음의 경우일반 파일, 콘텐츠를 복사하고 싶지 않은 민감한 파일을 처리해야 하는 추가 요구 사항이 있습니다(해당 콘텐츠는 계속해서 해시에 표시됩니다). 내 목표는 위에서 설명한 프로세스에서와 똑같은 로컬 파일을 만드는 것입니다. 단, 파일은 원격 파일의 내용을 포함하는 대신 비어 있어야 합니다.

참고: 파일을 복사한 다음 콘텐츠 사본을 비울 수는 없습니다. 민감한 파일이므로 해당 콘텐츠를 네트워크를 통해 전송해서는 안 됩니다.

나는 파일의 모드, 소유자 및 그룹을 가지고 있지만 tarball의 내용을 생략하는 일반 파일의 "쉘"을 tar로 전송하도록 하는 방법을 모릅니다. tar를 사용하여 이 작업을 수행하는 방법을 아는 사람이 없다면 tar 이외의 다른 메커니즘을 살펴봐야 할 것 같습니다.

이 작업을 가장 쉽게 수행할 수 있는 방법은 무엇입니까?

업데이트 #1

내가 시도하는 한 가지 접근 방식은 먼저 파일의 임시 복사본을 만드는 것입니다(다음을 사용하여).cp -p내가 관심 있는 파일 속성을 유지하기 위해 원격 시스템에서 해당 임시 파일의 콘텐츠를 비우고(다음을 사용하여)자르기 -s 0) 그런 다음 위에서 설명한 대로 tar / ssh를 사용하여 로컬 컴퓨터에 복사합니다. 이것은 어색하고 우아하지 않습니다. 임시 파일을 사용하지 않고 이를 수행할 수 있는 방법을 찾고 싶습니다.

답변1

tar를 실행하기 전에 민감한 파일 위에 빈 파일을 마운트할 수 있습니다.

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

아니면 비슷한 것.

관련 정보