scp와 압축은 중간 저장 없이 동시에 수행됩니다.

scp와 압축은 중간 저장 없이 동시에 수행됩니다.

정식 방법은 무엇입니까?

  • 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

답변1

원하는 것을 수행하는 방법에는 여러 가지가 있습니다. 가장 쉬운 방법은 pìpe를 사용하는 것입니다.

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
    
  • rsync어쩌면 당신이 친절 해질 수 있는 방법이 있을 수도 있지만 7za, 그렇게 하는 것은 아무 소용이 없습니다. 이 방법의 장점 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은 파일 소유자/그룹을 저장하지 않습니다.

답변2

내 생각엔 이 명령이 효과가 있을 것 같아

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

이제 먼저 대상 호스트에서 이 명령을 실행해야 합니다. 그리고 설명이 필요한 세부 사항은 다음과 같습니다.

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

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

인용하다

답변3

작은 개선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/"

관련 정보