Rsync komutunu sftp üzerinden kullanmak mümkün müdür (ssh kabuğu olmadan)?


60

Ssh üzerinde Rsync, her zaman harika çalışıyor.

Ancak, yalnızca sftp girişlerine izin veren, ancak ssh girişlerine izin vermeyen bir ana bilgisayara rsync denemek aşağıdaki hatayı sağlar:

rsync -av / kaynak ssh kullanıcısı @ remotehost: / target /

protokol sürümü uyuşmazlığı - kabuğunuz temiz mi? (bir açıklama için rsync man sayfasına bakın) rsync hatası: compat.c (171) [sender = 3.0.6] protokol uyumsuzluğu (kod 2)

İşte rsync man sayfasından ilgili bölüm:

Bu mesaja genellikle rsync'in aktarımı için kullandığı akışta istenmeyen çöpler üreten başlangıç ​​komut dosyalarınız veya uzak kabuk tesisiniz neden olur. Bu sorunu teşhis etmenin yolu, uzak kabuğunuzu şu şekilde çalıştırmaktır:

          ssh remotehost /bin/true > out.dat

sonra dışarı bak. Her şey doğru çalışıyorsa, out.dat sıfır uzunluklu bir dosya olmalıdır. Yukarıdaki hatayı rsync'den alıyorsanız, muhtemelen out.dat dosyasının bir metin veya veri içerdiğini göreceksiniz. İçeriğe bakın ve ne ürettiğini hesaplamaya çalışın. En yaygın neden, etkileşimli olmayan girişler için çıktı ifadeleri içeren yanlış yapılandırılmış kabuk başlangıç ​​komut dosyalarıdır (.cshrc veya .profile gibi).

Bunu denemek benim sistemimde out.dat içinde şöyle sonuçlandı:

ssh-dummy-shell: Komuta izin verilmiyor.

Düşündüğüm gibi, ev sahibi ssh girişlerine izin vermiyor.

Aşağıdaki bağlantı , bu görevi sshfs ile sigorta kullanarak gerçekleştirmenin mümkün olduğunu gösteriyor - bununla birlikte oldukça yavaş ve üretim için uygun değil.

Rsync sftp'yi çalıştırma şansı var mı?


3
lftp hile yapacak. Yerel ile uzaktaki -R anahtarıyla

Sunucudaki komutların nasıl kısıtlandığını biliyor musunuz? ForceCommand komutunu sshd_config içinde ayarlayarak ise, işaret eden dosyayı değiştirip değiştiremeyeceğinizi görün. Ya da yetkili_keylerde komutla ayarlanmışsa, o zaman belki sshfs üzerinden yetkili_ anahtarlarına erişebilir ve onu değiştirebilir misiniz?
ptman

Csync'i deneyebilirsiniz : csync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csyncBu cevaba bakınız .
nachtigall

6
Sonunda, lftp ile yaptım :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall

@nachtigall, çoklu giriş dosyaları / dosya ve dizin listesi ile lftp'nin nasıl kullanılacağını biliyor musunuz?
bortran

Yanıtlar:


39

Ne yazık ki doğrudan değil. Bu şekilde çalıştırıldığında rsync, uzak kopyasını başlatmasını sağlayacak bir kabuk ile temiz bir bağlantı gerektirir rsync.

Ana bilgisayarda uzun ömürlü dinleme işlemlerini yürütmenin bir yolunu kullanıyorsanız, rsync'i ayrıcalıklı olmayan bir bağlantı noktasındaki bağlantıları manuel olarak dinlemeye başlatabilirsiniz, ancak bunu yapmak için çoğu teknik SSH aracılığıyla da uygun kabuk erişimi gerektirebilir ve ana bilgisayar güvenlik duvarı düzenlemeleri, seçtiğiniz bağlantı noktasında bağlantıların kurulmasına izin verir (ve ana bilgisayar, ilk başta rsync yüklüdür). Genel olarak adreslenebilir bir hizmet olarak rsync çalıştırmak (dolaylı olarak SSH veya benzeri yoluyla değil) genel olarak açık olmayan veriler için önerilmez.

Eğer barındırıyorsanız PHP'de veya benzeri komut dosyası çalıştırmaya izin veriyorsa ve kilitli değilse, ekstra komutlar execkullanıcı komut dosyaları tarafından edilemez , o zaman rsync'i bu şekilde dinleme modunda başlatabilirsiniz . Uçunuz bağlanabiliyorsa (SSH'yi dış dünyaya erişebiliyorsanız) bunu tersten deneyebilirsiniz - sunucuda rsync komut dosyasını çalıştırın, ancak gelen bağlantıları dinlemek yerine yerel servisinize danışın ve bu şekilde senkronize edin. Bu hala rsync'in gerçekte verilmeyen bir ana bilgisayara kurulmasına veya çalışan bir kopya yükleyebileceğinize, ancak bir rsync arka planını halka açık adreslenebilir bir şekilde çalıştırmanın ve şifrelenmemiş bir şekilde konuşmanın güvenlik etkilerine sahip olmamasına dayanmaktadır. kanal.

Yukarıda açıklandığı gibi uğraşmak, hiç çalışmasa ve sizi kovmaya başlamasına rağmen, ev sahibi politikalarına aykırı olabilir. Bu hesap için tam bir kabuğun etkinleştirilip etkinleştirilemeyeceğini sormak ve o ana bilgisayar için rsync'i bırakmak veya o ana bilgisayarı terk etmek ve bunu yapmazlarsa başka bir yere taşımak daha iyidir.


2
Dolu bir kabuk olması gerekmediğini unutmayın; rsync komutunun çalışması için uygun argümanlara izin vermesi gerekir. scponly bunun için kullanışlıdır.
Sciurus

19

Teorik olarak evet. Uzak dosya sistemini FUSE kullanarak yerel makinenize monte edebilirsiniz . Ardından takılan dizin ile yerel dizin arasında yerel bir rsync kopyası çalıştırabilirsiniz. Bunu şahsen denemedim ama teoride çalışması gerekiyor. Karşılaştırma yapmak için her bir dosyanın en az bir bölümünü aktarması gerekeceğinden, rsync'in SSH üzerinden gerçekleştirilmesi çok daha az etkili olacaktır.


11
Ne zaman gönderilmesi gerektiğine karar vermek için zaman damgası + boyut karşılaştırması yeterli olduğunda bu işe yaramalıdır. Bir sağlama toplamı gerekli olduğunda, uzak dosyanın tamamı, gönderilen güncelleştirmelerin yanı sıra, tüm satır boyunca okunacaktır, bu nedenle rsync'in seçeneklerinin her dosya için ya hep ya hiç yapmasını sağlayacak şekilde ayarlanmış olduğundan emin olun (--ignore- times veya --checksum ve --whole-file belirtilmiş olması yeterli olabilir). --Link-dest gibi bazı seçeneklerin bu şekilde (veya hiç) düzgün çalışması pek olası değildir.
David Spillett

Bazı detayları eklediğiniz için teşekkürler David. Bu benim düşündüğüm verimlilikte bir tür sınırlama oldu, sadece onları da tam olarak ifade etmedim :)
Kamil Kisiel

Bu, sınırlamaları olan bir geçici çözüm, evet, ancak "uygun" rsync'i çağırmanın bir yolu yoksa, yeterince iyidir
Valery Lourie,

10

Rsync kullanmanın bir alternatifi bunun yerine lftp (sftp'ye bağlanabilen) kullanmak ve mirror komutunu kullanmaktır. Örneğin bir yapabilir

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit

1
Bu yazı soruyu cevaplamıyor olsa da faydalı bir alternatif sunuyor
Dmitri Chubarov

5

biraz geç, ama işte sshfs kullanarak nasıl yaptığım

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt

3
@David Spillett'in daha önceki bir cevaba yaptığı yorumunda ( serverfault.com/questions/135618/… ) söylediği gibi , bu işe yarayacak, ancak rsync protokolünün verimsiz bir şekilde kullanılması biraz daha fazla olacaktır.
Evan Anderson

2
jonathan, bence senin çözümün yanlış. Bir uzak sürücüyü monte ederseniz ve iki yerel klasörü senkronize edeceğiniz gibi rsync'i çalıştırırsanız, yerel makinenizdeki rsync işlemi uzak dosyaların karma değerlerini hesapladığından, senkronizasyonda her zaman her şey aktarılır. Bu, tüm dosyanın aktarıldığı ve rsync'in yararlarının kaybolduğu anlamına gelir. Düzenleme: ah bu cevap birkaç kez verildi ... replikasyon için
ağlamak

2

Hayır. Rsync diğer tarafta rsync'i çalıştırarak ve onunla iletişim kurarak çalışır, bu da bir tür kabuk erişiminin gerekli olduğu anlamına gelir.


2

Alternatif olarak, rsync'i daemon olarak başlatmak ve ona SSH tüneli aracılığıyla bağlamak olabilir.


Bu cevap tamamen yardımcı olmak için çok kısadır, ancak sunucu tarafı kabuk erişimine izin veremiyorsa (1) yerel olarak dinleyen bir rsync sunucusuna izin verebilirse (dışarıdan güvenlik için), ve (2) ssh tüneli ilke authorized_keys, belirli bir tünele izin veren ve örneğin çalışan bir kural aracılığıyla sunucuya giriş yapabilir sleep 86400. Sonra müşteri tarafı rsynctünelden geçebildi .
Stéphane Gourichon

2

En iyisini birleştiren seçenek

Buradaki diğer cevapların sahip olmadığı aşağıdaki avantajlara sahip görünüyor:

  • SSH'den tamamen faydalanın (güvenli)
  • rsync'ten (bant genişliği etkin protokol, bant genişliği sınırlaması gibi tüm rsync seçenekleri) tam olarak faydalanın
  • aslında verimli (bazen günleri koruyan ancak uygulamada hala yavaş olan sshfs'den farklı olarak)
  • isteğe bağlı kabuk komutlarına sunucu tarafında ihtiyaç duymaz
  • ssh tünellerine izin vermek için sunucuya ihtiyaç duymaz
  • bir rsyncdaemon çalıştırmak için sunucuya ihtiyaç duymaz

Henüz test etmedim, ancak hariç tüm bu özellikleri başarıyla kullandım rrsync.

Nasıl yapılır

  • yerel olarak bir anahtar oluşturun ssh-keygen(openSSH özelliği)
  • Sunucunun yalnızca belirli bir anahtarla oturum ~/.ssh/authorized_keysaçmasına izin ver , sunucunun girişi ile (openSSH özelliği)
  • Bu anahtarı , rsync ile dağıtılan ~/.ssh/authorized_keyskomut dosyasını kullanarak (openSSH özelliği) ile belirli bir komuta ilişkilendirinrrsynccommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Ardından normal istemciden rsync yapabilirsiniz.

Daha fazla ayrıntıya ihtiyacınız varsa

SSH Erişimini rsync ile Kısıtlama | Guy Rutenberg

Yukarıdaki bağlantının ötesinde bir adım

Bu sayfanın sonundaki komut daha kısa yapılabilir. Bunun ~/.ssh/configgibi bir stanza oluşturmak:

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

sonra istemciden rsync komutunuz

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

olur

rsync -av user@remote: etc2/

1
Ne yazık ki bunun bir SFTP sunucusuyla rsync kullanmakla bir ilgisi yoktur, bununla birlikte, bir OpenSSH sunucusunun rsyncçalıştırılmasına izin verecek şekilde SFTP yönünü gözden geçirerek yapılandırılması ile ilgilidir. Bir başkasının SFTP sunucusuyla herhangi bir kontrolünüz olmadığı bildirilirse, bu cevap sorunu çözemez.
Malvineous

Haklısın. Bunu başka bir soruyu cevaplamak için yazmış ve yanlışlıkla buraya göndermiş olabilirim. Cevabımı burada kaldırmayı düşünüyorum.
Stéphane Gourichon 7:18
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.