scp와 동시에 압축, 중간 저장 없음


63

정식 방법은 무엇입니까?

  • scp 원격 위치에 파일
  • 전송중인 파일 압축 ( tar단일 파일 또는 전체 폴더 7za또는 기타 효율적인 파일)
  • 중간 파일을 저장하지 않고 위의 작업을 수행하십시오.

다음과 같은 쉘 파이프에 익숙합니다.

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z

본질적으로 :

  • 전체 폴더를 단일 폴더로 롤링 tar
  • 을 통해 데이터를 전달 stdout하는 stdin로터리 압축기의 압축 프로그램
  • 공격적인 압축 적용

ssh파일을 원격 파일 시스템에 연결 한 상태에서 링크를 통해이를 수행하는 가장 좋은 방법은 무엇입니까 ?


나는 sshfs마운트 하지 않는 것을 선호합니다 .


이것은 작동하지 않습니다.

scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z

때문에:

/dev/fd/63: not a regular file

답변:


102

원하는 것을하는 방법은 여러 가지가 있습니다. 가장 간단한 방법은 ppe를 사용하는 것입니다.

tar zcvf -  MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz"

여기서 압축은 tar어떤 호출 gzip( z플래그)에 의해 처리되고 있습니다. compress( Z) 및 bzip( j)를 사용할 수도 있습니다 . 에 대해 다음 7z을 수행하십시오.

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z | 
   ssh user@server "cat > /path/to/backup/foo.7z"

그러나 가장 좋은 방법은 아마입니다 rsync.

   Rsync is a fast and extraordinarily versatile  file  copying  tool.   It  can  copy
   locally, to/from another host over any remote shell, or to/from a remote rsync dae‐
   mon.  It offers a large number of options that control every aspect of its behavior
   and  permit  very  flexible  specification of the set of files to be copied.  It is
   famous for its delta-transfer algorithm, which reduces the amount of data sent over
   the network by sending only the differences between the source files and the exist‐
   ing files in the destination.  Rsync is widely used for backups and  mirroring  and
   as an improved copy command for everyday use.

rsync방법은 너무 많은 옵션을. 실제로 읽을 가치가 있지만 첫눈에 무섭습니다. 이 맥락에서 관심있는 것은 다음과 같습니다.

    -z, --compress              compress file data during the transfer
        --compress-level=NUM    explicitly set compression level

   -z, --compress
          With this option, rsync compresses the file data as it is sent to the desti‐
          nation machine, which reduces the amount of data being transmitted --  
          something that is useful over a slow connection.

          Note  that this option typically achieves better compression ratios than can
          be achieved by using a compressing remote shell or a  compressing  transport
          because  it takes advantage of the implicit information in the matching data
          blocks that are not explicitly sent over the connection.

따라서 귀하의 경우 다음과 같은 것을 원할 것입니다.

rsync -z MyBackups user@server:/path/to/backup/

파일은 전송 중에 압축되어 도착지에 압축이 풀린 상태로 도착합니다.


더 많은 선택 :

  • scp 자체는 데이터를 압축 할 수 있습니다

     -C      Compression enable.  Passes the -C flag to ssh(1) to
             enable compression.
    
    $ scp -C source user@server:/path/to/backup
    
  • 이 얻을 수있는 방법이 될 수 있습니다 rsync7za좋은 플레이 있지만 이렇게 아무 문제가 없다. rsync로컬 파일과 원격 파일간에 변경된 비트 만 복사한다는 이점이 있습니다. 그러나 작은 로컬 변경으로 인해 압축 파일이 매우 다를 수 있으므로이를 사용할 필요가 없습니다 rsync. 아무런 이익이없이 문제를 복잡하게 만듭니다. ssh위와 같이 직접 사용하십시오 . 당신이 경우 정말 이 작업을 수행하려면, 당신은 인수로 서브 쉘을 제공하여 시도 할 수 있습니다 rsync. 내 시스템에서는 7za압축 된 데이터를 터미널에 쓸 수 없으므로이 작업을 수행 할 수 없습니다 . 아마도 구현이 다를 수 있습니다. 다음과 같은 것을 시도하십시오 ( 이것은 저에게 효과적이지 않습니다 ).

    rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \
      user@server:/path/to/backup
    
  • 또 다른 요점은 7z Linux에서 백업에 사용해서는 안된다는 것 입니다. 7z매뉴얼 페이지 에 명시된 바와 같이 :

    Linux / Unix에서 백업 목적으로 7-zip 형식을 사용하지 마십시오.--7-zip
    은 파일의 소유자 / 그룹을 저장하지 않습니다.


3
인터넷과 같이 일반적으로 느린 네트워크를 통해 전송하지 않는 한 전송 속도를 늦추므로 압축을 피하는 것이 가장 좋습니다. LAN -z에서는 두 배 이상 느립니다. ssh를 통한 rsyncing보다 더 빠른 속도를 위해서는 -W플래그를 사용하여 rsync 데몬과 rsync를 설정하십시오 (파일 전체를 복사합니다 (delta-xfer 알고리즘 없음)
laebshade

2
감사! 나는이 위대한 대답을 받아들이려고하지만, 모두를 사용하는 완전 독립형 명령 줄을 추가하십시오 오전 rsync 7za 원격 파일 시스템에 최종 출력. 마음에 -z들었지만 압축 단계를 분리하고 싶습니다. rsync이 경우 어떻게 사용 하시겠습니까?
Robottinosino

2
@Robottinosino는 업데이트 된 답변을 참조하십시오. rsync와 함께 사용할 때는 아무런 의미가 없습니다 7z. 그것은 해야한다 그림과 같이 rsync를하고 subshel와 함께 작동하지만 난 어떻게해서든지 알아낼 수 없었다.
terdon

4
일에 대한 scp -C. 원격 디스크에 압축 파일을 저장할 공간이 부족하여 전송 전에 압축 할 수 없었습니다. 하나의 작은 명령 행 옵션으로 문제가 해결되었습니다.
user37931

1
@knutole은 파일을 먼저 압축 한 다음 다시 동기화합니다. 자세한 내용이 필요하면 새로운 질문을하십시오.
terdon

13

나는이 명령이 트릭을 할 것이라고 생각한다

ssh user@host "cd /path/to/data/;tar zc directory_name" | tar zx 

편집 : 이전 버전에는 두 가지 잘못된 "f"옵션이있었습니다.

이제 대상 호스트에서이 명령을 실행해야합니다. 설명 할 세부 사항 :

  1. ssh user @ host는 데이터가 전송 될 호스트 시스템에 대한 연결을 엽니 다.
  2. cd / path / to / data는 필요한 데이터가 저장된 디렉토리로 이동합니다
  3. tar zc *는 압축을 시작하여 STDOUT에 넣습니다.
  4. 이제 pipe (|)는 소스의 STDOUT을 "tar zx"가 실행중인 대상의 STDIN으로 파이프 라인하고 소스에서 오는 데이터 스트림을 지속적으로 압축 해제합니다.

보시다시피이 명령은 즉시 압축하여 대역폭을 절약합니다. 더 나은 결과를 위해 다른 압축을 사용할 수도 있지만 압축 및 압축 해제에는 CPU주기가 필요합니다.

참고


tar : 이전 옵션 'f'에는 인수가 필요합니다.
Dimitri Kopriwa

7

dkbhadeshiya의 대답에 대한 작은 개선 : 할 필요는 없으며 대신 cd dir작업 디렉토리를 지정하십시오 tar.

ssh user@host "tar -C /path/to/data/ -zc directory_name" | tar zx 

같은 방법으로 디렉토리를 업로드 할 수도 있습니다.

tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.