aynı anda scp ve sıkıştır, orta tasarruf yok


63

Kanonik yol nedir:

  • scp uzak bir konuma dosya
  • dosyayı transit yolunda sıkıştırın ( tarveya tek bir dosya veya tüm bir klasör 7zaveya daha verimli bir şey değil)
  • ara dosyaları kaydetmeden yukarıdakileri yapın

Bunun gibi kabuk borularına aşinayım:

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

esasen:

  • bir klasörü tek bir klasöre döndürmek tar
  • üzerinden veri aktarmak stdoutiçin stdinsıkıştırma programının
  • agresif sıkıştırma uygulayın

sshUzak dosya sistemine dosya inerken bunu bir bağlantı üzerinden yapmanın en iyi yolu nedir ?


Monte etmemeyi tercih ederim sshfs.


Bu çalışmıyor:

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

Çünkü:

/dev/fd/63: not a regular file

Yanıtlar:


102

İstediğini yapmanın birçok yolu var. En basit olanı bir ppe kullanmaktır:

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

Burada sıkıştırma tarhangi çağrılar gzip( zbayrak) tarafından yapılır . Ayrıca compress( Z) ve bzip( j) kullanabilirsiniz. Bunun için 7z:

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

En iyi yolu, ancak, muhtemelen 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.

rsyncsahiptir yolu çok fazla seçenek. Gerçekten onlar aracılığıyla okumaya değer ancak ilk bakışta korkutucu. Bu bağlamda umursadıklarınız:

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

Yani, sizin durumunuzda, böyle bir şey istersiniz:

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

Dosyalar transit halindeyken sıkıştırılır ve hedefe dekompresyon yapılır.


Bazı daha fazla seçenek:

  • scp veriyi sıkıştırabilir

     -C      Compression enable.  Passes the -C flag to ssh(1) to
             enable compression.
    
    $ scp -C source user@server:/path/to/backup
    
  • Güzelleşmenin rsyncve 7zagüzelce oynamanın bir yolu olabilir ama bunu yapmanın bir anlamı yok. Bunun yararı, rsyncyalnızca yerel ve uzak dosyalar arasında değişen bitleri kopyalayabilmesidir. Bununla birlikte, küçük bir yerel değişiklik çok farklı bir sıkıştırılmış dosyaya neden olabilir, bu yüzden bunun için hiçbir anlamı yoktur rsync. Sadece faydası olmayan işleri karmaşıklaştırıyor. Sadece sshyukarıda gösterildiği gibi doğrudan kullanın . Bunu gerçekten yapmak istiyorsan, bir alt kabuk argümanı olarak vererek deneyebilirsin rsync. Sistemimde bununla çalışamadım 7zaçünkü sıkıştırılmış veriyi bir terminale yazmanıza izin vermiyor. Belki de uygulamanız farklıdır. Gibi bir şey deneyin ( bu benim için işe yaramaz ):

    rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \
      user@server:/path/to/backup
    
  • Başka bir nokta, 7z Linux'taki yedeklemeler için kullanılmaması gerektiğidir . 7zMan sayfasında belirtildiği gibi :

    7-zip biçimini Linux / Unix'te yedekleme amacıyla KULLANMAYIN, çünkü:
    - 7-zip, dosyanın sahibini / grubunu saklamaz.


3
Eklemek için iyi bir not, genel olarak yavaş bir ağ üzerinden aktarmadığınız sürece, internetin, aktarma hızını yavaşlattığı için sıkıştırmamanın en iyisi olduğunu söylemektir. Bir LAN'da -zen az iki kat daha yavaş. Kullanılarak SSH üzerinde rsyncing, kurulum, bir rsync sunucusu ve rsync daha fazla hız için -Wbayrağı (kopya dosyaları (a / a), delta-havalesine algoritma o bütün.
laebshade

2
Teşekkürler! Bu büyük cevabı kabul edecek ama, hem kullanan bir tam, bağımsız bir komut satırı ekleyin lütfen am rsync ve 7za uzaktan dosya sistemine son çıkışı ile. Sevdim -zama sıkıştırma aşamasını ayırmak istiyorum .. rsyncbu durumda nasıl kullanırım ?
Robottinosino

2
@Robottinosino güncellenmiş cevabı gör. Kullanmanın hiçbir anlamı yoktur rsyncile 7z. Bu olmalıdır gösterildiği gibi rsync ve subshel ile çalışmak ama nasıl neyse çözemedim.
terdon

4
İçin +1 scp -C. Uzak diskte sıkıştırılmış dosyayı tutmaya yetecek kadar yer yoktu, bu yüzden transferden önce sıkıştıramadım. Bir küçük komut satırı seçeneği sorunumu çözdü.
user37931 23:14

1
@ knutole önce dosyayı sıkıştırır, sonra rsync. Daha fazla ayrıntıya ihtiyacınız olursa lütfen yeni bir soru sorun.
Terdon

13

Bence bu komut işe yarayacak

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

EDIT: önceki bir sürümü iki yanlış "f" seçeneği ile oldu.

Şimdi, öncelikle bu komutu hedef ana bilgisayardan yürütmelisiniz. Ve açıklanacak detaylar:

  1. ssh user @ host, verilerin aktarılacağı yerden host makineye bağlantı açacaktır.
  2. cd / path / to / data, gerekli verilerin depolandığı dizine gidecektir
  3. tar zc * sıkıştırmayı başlatacak ve STDOUT'a koyacaktır
  4. Şimdi pipe (|) kaynağın STDOUT'unu "tar zx" in çalıştığı yerin STDIN'ına boru hattına bağlayacak ve kaynaktan gelen sürekli olarak dekompresyon veri akışını açacaktır.

Gördüğünüz gibi bu komut anında yayılıyor ve bant genişliğinden tasarruf sağlıyor. Diğer sıkıştırmaları daha iyi sonuçlar elde etmek için de kullanabilirsiniz, ancak unutmayın, sıkıştırma ve dekompresyonun CPU çevrimi gerektirdiğini unutmayın.

Referans


tar: Eski seçenek 'f' bir argüman gerektirir.
Dimitri Kopriwa,

7

Dkbhadeshiya'nın cevabı için küçük iyileştirme : yapmak zorunda değilsiniz cd dir, sadece tarbunun yerine çalışma dizinini belirtin :

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

Dizini de aynı şekilde yükleyebilirsiniz:

tar zc directory_name/ | ssh user@host "tar zx -C /new/path/to/data/"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.