원격 서버에서 마지막 실행 이후 디렉터리 구조의 모든 파일을 복사합니다.

원격 서버에서 마지막 실행 이후 디렉터리 구조의 모든 파일을 복사합니다.

나는 /tmp/때때로 내 디렉토리를 스캔하여 마지막으로 이 작업을 수행한 이후 어떤 파일이 변경되었는지 확인하고 싶습니다. 변경된 모든 파일은 디렉터리 구조를 유지하면서 백업으로 원격 서버에 복사되어야 합니다. 비슷한 것을 시도했지만 우분투에서는 제대로 작동하지 않습니다.Permission denied (publickey).

#!/bin/bash
TARGET=/bkp
[email protected]
SOURCE=/tmp

touch $TARGET/last_sync

rsync \
    -ahrv \
    --update \
    -e \
    --files-from=<ssh -i /home/ubuntu/ssh_key.pem $HOST "find $SOURCE -type f -newer $SOURCE/last_sync -exec realpath --relative-to=$SOURCE '{}' \;" \
    $HOST:$SOURCE \
    $TARGET

rsync -ahv $TARGET/last_sync $HOST:$SOURCE

내 계획은 원본 컴퓨터에 설치하는 것입니다.

ubuntu@source:~/$ tree /tmp
.
├── file1.txt
├── dir1
│   ├── subdir1
│   │   └── file3.txt
│   └── file2.txt
├── file4.txt

처음 실행하면 아래와 같이 원격 컴퓨터에 복사되어야 합니다.

ubuntu@remote:~/$ tree /bkp
.
├── file1.txt
├── dir1
│   ├── subdir1
│   │   └── file3.txt
│   └── file2.txt
├── file4.txt

몇 시간 후 /tmp/dir1/file5.txt새 파일이 추가되고 /tmp/file4.txt파일이 변경되었습니다.

스크립트를 실행한 후 원격으로 동기화해야 합니다(두 개의 파일이 추가됨).

ubuntu@remote:~/$ tree /bkp
.
├── file1.txt
├── dir1
│   ├── subdir1
│   │   └── file3.txt
│   └── file2.txt
|   | -- file5.txt <-- ADDED
├── file4.txt <-- ADDED (replaced)

나는 macos -> ubuntu에서 비슷한 것을 달성할 수 있었지만 scp와 더 많은 "로직"을 사용하여 지난 N 시간 동안 변경된 파일을 확인하고 N 시간마다 스크립트를 실행했습니다.

답변1

Permission denied (publickey)가장 큰 문제는 오류가 발생하는 것 같습니다 . 이는 인증서 기반 인증을 사용할 때 발생하는 일반적인 인증 문제입니다 ssh. 세 번 호출 ssh하지만 기본이 아닌 개인 인증서(키)를 한 번만 제공하는 코드를 살펴보세요.

  1. rsync업데이트 수행
  2. sshfind최신 파일을 찾기 위해 호출됨
  3. rsync동기화 비콘 파일 복사

이 연결에 사용하기에 적합한 키 라면 /home/ubuntu/ssh_key.pem매번 참조해야 합니다.

두 번째 문제는 대부분의 코드에서 구문이 정말 잘못된 것처럼 보인다는 것입니다. 코드를 전달하기 위해 ServerFault에 대한 내 조언을 받아들인 것으로 알고 있습니다.https://shellcheck.net/bash, 그러나 이제 코드를 구문 분석할 수 있지만 여전히 구문상 잘못된 부분이 있습니다 . 예를 들어,

rsync \
    -ahrv \
    --update \
    -e \
    --files-from=<ssh -i /home/ubuntu/ssh_key.pem $HOST "find $SOURCE -type f -newer $SOURCE/last_sync -exec realpath --relative-to=$SOURCE '{}' \;" \
    $HOST:$SOURCE \
    $TARGET

매개변수가 있는 옵션이 함께 연결되도록 다시 작성하면 다음과 같은 결과를 얻습니다.

rsync \
    -ahrv \
    --update \
    -e --files-from=
    -i \
    /home/ubuntu/ssh_key.pem $HOST "find $SOURCE -type f -newer $SOURCE/last_sync -exec realpath --relative-to=$SOURCE '{}' \;" $HOST:$SOURCE $TARGET
    <ssh
  • ssh읽을 수 있는 파일이 없습니다 .표준 입력, 그리고 아무것도 처리할 수 없습니다
  • --files-from=참조된 명령이 -e존재하지 않습니다.
  • 4개의 소스 파일/디렉토리가 복사됩니다 $TARGET(나머지 명령이 작동하는 경우).

rsync나는 당신이 달성하려는 것이 무엇인지 알 수 있다고 믿지만 왜 일반 작동 모드에서 사용하고 파일을 직접 복사 하지 않는지 완전히 확신하지 못합니다 . 불필요한 find. 비콘 파일을 동기화할 필요가 없습니다.

#!/bin/bash
[email protected]
source=/path/to/source
target=/bkp

rsync -av -e 'ssh -i /home/ubuntu/ssh_key.pem' "$rhost:$source/" "$target"

관련 정보