scp và nén cùng một lúc, không lưu trung gian


64

Cách chính tắc để:

  • scp một tập tin đến một địa điểm từ xa
  • nén tệp trong quá trình ( tarhoặc không, tệp đơn hoặc toàn bộ thư mục 7zahoặc một cái gì đó thậm chí còn hiệu quả hơn)
  • làm như trên mà không lưu tập tin trung gian

Tôi quen thuộc với các ống vỏ như thế này:

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

bản chất:

  • cuộn toàn bộ một thư mục vào một tar
  • truyền dữ liệu stdoutđến stdinchương trình nén
  • áp dụng nén tích cực

Cách tốt nhất để làm điều này qua một sshliên kết, với tệp hạ cánh trên hệ thống tệp từ xa là gì?


Tôi không thích sshfsgắn kết.


Điều này, không hoạt động:

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

bởi vì:

/dev/fd/63: not a regular file

Câu trả lời:


103

Có nhiều cách để làm những gì bạn muốn. Đơn giản nhất là sử dụng pìpe:

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

Ở đây, việc nén đang được xử lý bằng cách targọi gzip( zcờ). Bạn cũng có thể sử dụng compress( Z) và bzip( j). Đối với 7z, làm điều này:

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

Cách tốt nhất , tuy nhiên, có lẽ là 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.

rsynccách quá nhiều lựa chọn. Nó thực sự đáng đọc qua chúng nhưng chúng đáng sợ ngay từ cái nhìn đầu tiên. Những người bạn quan tâm trong bối cảnh này là:

    -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.

Vì vậy, trong trường hợp của bạn, bạn sẽ muốn một cái gì đó như thế này:

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

Các tập tin sẽ được nén trong khi quá cảnh và đến nơi được giải nén tại đích.


Một số lựa chọn khác:

  • scp chính nó có thể nén dữ liệu

     -C      Compression enable.  Passes the -C flag to ssh(1) to
             enable compression.
    
    $ scp -C source user@server:/path/to/backup
    
  • Có thể có một cách để có được rsync7zachơi tốt nhưng không có điểm nào để làm như vậy. Lợi ích của rsyncnó là nó sẽ chỉ sao chép các bit đã thay đổi giữa các tệp cục bộ và từ xa. Tuy nhiên, một thay đổi cục bộ nhỏ có thể dẫn đến một tệp nén rất khác nhau do đó không có điểm nào trong việc sử dụng rsynccho việc này. Nó chỉ làm phức tạp vấn đề không có lợi ích. Chỉ cần sử dụng trực tiếp sshnhư hình trên. Nếu bạn thực sự muốn làm điều này, bạn có thể thử bằng cách đưa ra một lớp con làm đối số rsync. Trên hệ thống của tôi, tôi không thể làm việc này 7zavì nó không cho phép bạn ghi dữ liệu nén vào thiết bị đầu cuối. Có lẽ việc thực hiện của bạn là khác nhau. Hãy thử một cái gì đó như ( điều này không làm việc cho tôi ):

    rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \
      user@server:/path/to/backup
    
  • Một điểm khác là 7z không nên sử dụng để sao lưu trên Linux . Như đã nêu trên 7ztrang người đàn ông:

    KHÔNG SỬ DỤNG định dạng 7-zip cho mục đích sao lưu trên Linux / Unix vì:
    - 7-zip không lưu trữ chủ sở hữu / nhóm của tệp.


3
Một lưu ý tốt là thêm vào, trừ khi bạn chuyển qua mạng thường chậm, nói rằng internet, tốt nhất là tránh nén vì nó chỉ làm chậm tốc độ truyền. Trên mạng LAN, -zchậm hơn ít nhất hai lần. Để có tốc độ thậm chí nhiều hơn tốc độ rsyncing trên ssh, hãy thiết lập một daemon rsync và rsync bằng -Wcờ (sao chép toàn bộ tệp (thuật toán delta-xfer).
laebshade

2
Cảm ơn! Tôi sẽ chấp nhận câu trả lời tuyệt vời này, nhưng làm ơn, thêm một dòng lệnh độc lập, đầy đủ sử dụng cả hai rsync 7za , với đầu ra cuối cùng cho hệ thống tập tin từ xa. Tôi thích -znhưng tôi muốn tách rời giai đoạn nén vì vậy tôi sẽ sử dụng như thế nào rsynctrong trường hợp đó?
Robottinosino

2
@Robottinosino xem câu trả lời cập nhật. Không có điểm trong việc sử dụng rsyncvới 7z. Nó sẽ hoạt động với rsync và một lớp con như được hiển thị nhưng tôi không thể tìm ra cách nào.
terdon

4
+1 cho scp -C. Không có đủ chỗ trên đĩa từ xa để giữ tệp nén nên tôi không thể nén trước khi chuyển. Một tùy chọn dòng lệnh nhỏ làm cho vấn đề của tôi biến mất.
dùng37931

1
@knutole chỉ cần nén tệp trước, sau đó rsync nó. Vui lòng hỏi một câu hỏi mới nếu bạn cần thêm chi tiết.
terdon

13

Tôi nghĩ rằng lệnh này sẽ thực hiện các mẹo

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

EDIT: một phiên bản trước đó có hai tùy chọn "f" sai.

Bây giờ, trước hết bạn phải thực hiện lệnh này từ máy chủ đích. Và chi tiết sẽ được giải thích:

  1. ssh user @ host sẽ mở kết nối đến máy chủ, từ đó dữ liệu sẽ được truyền.
  2. cd / path / to / data sẽ đưa đến thư mục lưu trữ dữ liệu cần thiết
  3. tar zc * sẽ bắt đầu nén và đưa nó vào STDOUT
  4. Bây giờ pipe (|) sẽ dẫn STDOUT của nguồn tới STDIN của đích đến nơi "tar zx" đang chạy và liên tục giải nén luồng dữ liệu đến từ nguồn.

Như bạn có thể thấy lệnh này nén nhanh chóng và tiết kiệm băng thông. Bạn cũng có thể sử dụng các nén khác để có kết quả tốt hơn, nhưng hãy nhớ, nén và giải nén cần chu kỳ CPU.

Tài liệu tham khảo


tar: Tùy chọn cũ 'f' yêu cầu một đối số.
Dimitri Kopriwa

7

Cải thiện nhỏ cho câu trả lời của dkbhadeshiya : bạn không phải làm cd dir, chỉ cần chỉ định thư mục làm việc tarthay thế:

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

Bạn cũng có thể tải lên thư mục theo cách tương tự:

tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.