Rsync .bashrc ile uyumsuz görünüyor (neden “kabuğunuz temiz mi?”)


16

Görünüşe göre rsync .bashrc dosyası olan bir uzak sunucu ile çalışamaz?

Yerel istemcide rsync çalıştırdığımda aldım:

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]

Önerildiği gibi burada kaldırarak sunucuda Bashrc sorunu çözdü. .Bashrc dosyasını kaldırmadan nasıl geçici olarak çözülür?


1
Söz konusu hesap için ssh'ın etkin olup olmadığını kontrol edin.
Lamy

Aşağıdaki cevaplar büyük olasılıkla yanlıştır. Son zamanlarda .bashrc dosyalarımda hiçbir şey değişmese bile, rutin bir Ubuntu yükseltmesinden sonra bu hatayı almaya başladım.
Cerin

Hayır - .bashrc dosyasını kaldırırsanız (bu soruda belirtildiği gibi) giderilirse, sorun .bashrc'den çıkar. Yükseltme kesinlikle tamamen farklı bir sorun olan gerçek bir protokol uyumsuzluğu getirebilir.
Randall

Yanıtlar:


21

.bashrcUzak sunucudaki terminalde herhangi bir çıktı verirse sorunla karşılaşabilirsiniz . Rsync bunu beklemeyebilir ve bunun sonucunda sorun yaşayabilir.

Bu .bashrcçıktı metnindeki komutları kaldırarak veya herhangi bir çıktıyı / dev / null komutuna bağlayarak bunu düzeltebilirsiniz .


3
Öyleyse, yalnızca istemcideki dosyaları değiştirebilirsem / dev / null'a herhangi bir çıktı nasıl yönlendirilir?
Computist

1
Yardım için sistem yöneticiniz olarak yapabileceğinizi düşünüyorum. Sunucudaki dosyaları FTP veya scp gibi başka bir şekilde de değiştirebilirsiniz.
Greg Hewgill

Evet .bashrc dosyamda "*** ROOT Shell *** Başlatılıyor" ve echo "(Lütfen mümkün olduğunda kök kabuk yerine sudo kullanın!)" Adlı bir yankı vardı. Bu ekoları kaldırmak sorunu çözdü.
Kentgrav

1
Rsync man sayfasından: "protokol sürümü uyuşmazlığı - kabuğunuz temiz mi?" Bu iletiye genellikle başlangıç ​​komut dosyalarınız veya rsync'in taşınması için kullandığı akışta istenmeyen çöp üreten 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 out.dat dosyasına bakın. Her şey düzgün çalışıyorsa, out.dat sıfır uzunlukta bir dosya olmalıdır.
Kentgrav

8

Bu tür bir soruna neden olduğu için .bashrc çıktı üretmek için gerçekten doğru yer değildir. Bir çok insan, rsync'i çalıştırmaya çalışana kadar bununla kaçıyor :-)

İstenen çıktılar (ve ilişkili mantık ve komutlar) .bash_profile klasörünüze taşınmalıdır ( dosyalar arasındaki farklar hakkında daha fazla tartışma için bkz. Örneğin Sunucu Hatası sorusu ".profile vs. .bash_profile vs. .bashrc" ).

Bu şekilde, giriş yaptığınızda çıktı almaktan ödün vermenize veya rsync'i kullanmak istediğinizde .bashrc'nizde geçici değişiklikler yapmanıza gerek kalmaz.


6

Ben her zaman kullanıcı hesaplarımda .bashrc dosyaları vardı ve bugüne kadar kök hesabı kullanarak sunucuma bir şey rsync denemeden bu sorunu yaşamadım. Gönderiniz çözümü bulmama yardımcı oldu:

$ user / .bashrc dosyalarım bu tür sorunları önlemek için her zaman aşağıdaki bölümle başlar. Kökün .bashrc ve rsync'ing kopyasını şimdi bir cazibe gibi çalışıyor!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

HTH, karsten


Bu genellikle işe yaramaz rsync, çünkü herhangi bir nedenle "etkileşimli kabuk" olarak sınıflandırılır. Ancak yine de eklemek için iyi bir çizgi, çünkü herhangi bir çıktı varsa etkileşimli olmayan kabukları bozabilir.
Michael Schubert

Bence bu soru için en iyi çözüm. ".Bashrc içindeki metin çıktısını alan tüm komutları kaldırmak" yanıtını kabul etmek pratik değildir.
Qinsi

4

İçin karmaşık nedenlerle başka ana bilgisayara bağlanırken rsync / scp / sftp çalışır .bashrc. .Bashrc dosyanızın üstünde şu komutlardan birine sahip olmalısınız :

ya

[[ $- != *i* ]] && return

veya

[ -z "$PS1" ] && return

Yukarıdaki komutlardan herhangi biri, etkileşimli oturumlar için yalnızca .bashrc komutlarının geri kalanının yürütülmesine izin verir . Bildiğim kadarıyla başka herhangi bir oturum türü için onlara ihtiyacınız yok (ve gerçekten de bashrc bu tekniği kullanarak Arch ve Debian varsayılan bashrc gördüm).

Bununla birlikte, bashrc komutlarınızın etkileşimli olmayan oturumlar için bile çalışmasına izin vermek konusunda fazladan paranoyak olmak istiyorsanız, en azından bashrc'nizin böyle ( referans ) gibi çıktılar üreten komutlarını, yalnızca etkileşimli oturumlarda çalışacak şekilde sarmalısınız:

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

Diğerleri, bash_profile metin çıkışı komutları hareket öneririz öneririz ama bu her zaman iyi olup olmadığı hakkında şüphelerim var ( burada açıklanan nedenlerle )

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.