복사 중에 SCP가 심볼릭 링크를 무시하도록 할 수 있습니까?


80

나는 우리의 서버 중 하나를 다시 설치해야하고, 예방 차원에서, 나는 이동할 /home, /etc, /opt, 및 /Services백업 서버에.

그러나 문제가 있습니다. 심볼릭 링크가 많기 때문에 많은 파일이 여러 번 복사됩니다.

scp심볼릭 링크를 무시 하도록 만들 수 있습니까 (또는 실제로 링크를 디렉토리 나 파일이 아닌 링크로 복사)? 그렇지 않은 경우 다른 방법이 있습니까?

답변:


82

나는 그것이 가능하다는 것을 알았고 잘못된 도구를 사용했습니다. 나는 rsync로 해냈다.

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/

1
그래서이 명령은 무엇입니까? 심볼릭 링크를 무시하거나 새 링크를 생성합니까? -아브?
Ernestas Stankevičius

3
a아카이브 (사물 보존), v장황하고, h사람이 읽을 수있는 출력이며, e사용할 서비스를 지정합니다 (이 경우 ssh). 여기에서
quietContest

감사합니다. 이전 서버가 좀 더럽혀졌습니다. 새 서버에는 콘텐츠가 필요했습니다. 모든 소프트 링크가 손실되었지만 많은 부분이 끊어 졌으므로 이제 새 서버에서 느린 유지 관리 작업이됩니다. 다시 한 번 감사드립니다.
jlettvin

1
--safe-links는 디렉토리 내부에있는 링크를 보존하고 외부를 가리키는 링크를 복사하지 않도록합니다.
Colin Pitrat

29

나는 것을 발견 방법은 (나를 위해, 그러나 나는이 웹 사이트에 대한 작업을 한 대안을 찾을 작동하지 않았다 www.docstore.mik.ua/orellyrsync ).

특히 "O'Reilly : SSH : The Secure Shell. The Definitive Guide"의 섹션 7.5.3 .

7.5.3. 디렉터리의 재귀 복사본

...

scp는 디렉토리를 복사 할 수 있지만 반드시 최선의 방법은 아닙니다. 디렉토리에 하드 링크 또는 소프트 링크가 포함되어 있으면 복제되지 않습니다. 링크는 일반 파일 (링크 대상)로 복사되며, 더 나쁜 경우 순환 디렉토리 링크로 인해 scp1이 무한 반복됩니다. (scp2는 심볼릭 링크를 감지하고 대신 해당 대상을 복사합니다.) 명명 된 파이프와 같은 다른 유형의 특수 파일도 올바르게 복사되지 않습니다. 더 나은 해결책은 특수 파일을 올바르게 처리하는 tar를 사용하여 원격으로 보내는 것입니다. SSH를 통해 압축 해제 할 머신 :

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -

1
rsync가 원격 끝에 설치되지 않았거나 소스 디렉토리의 tarball이 이미있는 경우 (약간 수정하여) 좋은 제안입니다.
Trebor Rude 2014

1
대상에서 권한을 유지하려면 "p"(tar xpf)가 필요합니다.
Paul Lynch

참고로이 명령은 원본 컴퓨터 에서 실행 하여 파일을 대상 컴퓨터 로 푸시 해야합니다 . 제 경우에는 (많은 작고 압축되지 않은 파일) 또는 . scprsync
Gerardo Lima

후속 질문 : 소스 측에서 tar 명령이 원격으로 전송하기 전에 먼저 tarball 데이터를 로컬에 저장합니까? [소스 디스크가 거의 꽉 찼을 때 문제가됩니다. 예를 들어 98 %가 찼습니다.]
Jungle Editor

18

tarover ssh를 발신자와 수신자로 사용 하는 것도 트릭입니다.

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -

권한을 유지하기 위해 소스 측 --one-file-system과 대상 측에 추가했습니다 p.

tar에 대한 man 페이지는 말한다; --one-file-system = 마운트 지점을 교차하지 마십시오
AnneTheAgile

2

한 가지 해결책은 쉘 파이프를 사용하는 것입니다. 약간 더 짧은 이름을 가진 동일한 * .gz 파일에 연결하기 위해 일부 소프트웨어에서 생성 된 일부 * .gz 파일과 심볼릭 링크가있는 상황이 있습니다. 단순히 scp를 사용하면 심볼릭 링크가 일반 파일로 복사되어 중복됩니다. rsync가 심볼릭 링크를 무시할 수 있다는 것을 알고 있지만 내 gz 파일은 동기화 가능한 옵션으로 압축되지 않으며 이러한 gz 파일을 복사 할 때 동기화 속도가 매우 느립니다. 따라서 다음 스크립트를 사용하여 파일을 복사합니다.

find . -type f -exec scp {} target_host:/directory/name/data \;

-f 옵션은 일반 파일 만 찾고 기호 링크를 무시합니다. 소스 호스트에서이 명령을 제공해야합니다. 이것이 내 상황의 일부 사용자에게 도움이되기를 바랍니다. 내가 놓친 것이 있으면 알려주세요.


0

tar + ssh 명령을 사용하여 서버에서 폴더를 복사하기 위해 클라이언트에서 실행할 수있는 one liner 솔루션입니다.

ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>

참고 : mkdir은 필수입니다. 원격 대상 디렉토리가 없으면 명령은 원격 서버의 전체 홈을 압축하여 클라이언트로 추출합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.