protokol sürümü uyuşmazlığı - kabuğunuz temiz mi?


55

Burada verilen rsync yedeklemelerini yapmak için talimatları takip ederken: http://troy.jdmz.net/rsync/index.html

"Protokol sürümü uyumsuzluğu - kabuğunuz temiz mi?" Hatası alıyorum

İstemi (PS1 = "") ve motd (.hushlogin) göstergelerini susturmak için gereken bir yerde bunu okudum. Bunu yaptım, istem ve giriş başlığı (MOTD) artık görünmüyor, ancak çalıştırdığımda hata yine de görünüyor:

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/

Hem ssh istemcisi hem de sshd sunucusu protokolün 2. sürümünü kullanıyor.

Sorun ne olabilir Teşekkürler.

[EDIT] http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html 'nin bazen gerekli olduğunu belirten "v2' yi ssh veya slogin 'e kullanarak zorlamak

 ssh -2 -i ~/.ssh/my_private_key remotemachine"

Bu sorunu çözdüğümden emin değilim, bu değişikliğin SONRASI'na bu değişikliği koyduğumu düşünüyorum, ancak gerçek şu ki hatanın başka bir şeye evrimleştiği. Daha fazlasını öğrendiğimde bunu güncelleyeceğim. Bunu kesinlikle bir emacs kabuğunda çalıştırmak için öneriyi kesinlikle deneyeceğim - teşekkür ederim.


1
Giriş komut dosyalarınız hemen görünmeyen bir şey mi çıktı, örneğin bir pencere başlığı değiştirme komutu? Bunu kontrol etmenin bir yolu Emacs çalıştırmak ESC x shell, yazmak ve yapmaktır export TERM=xterm; ssh remotehost ls. Herhangi bir kontrol karakteri veya diğer sahte çıktılar görünürse, avlamanız gereken şey budur.
Gilles 'SO- kötülük'

1
Ben de aynı problemi yaşıyordum. Benim durumumda SSH sunucusu kullanıcıları chroot yapacak ve sadece SFTP erişimine izin verecek şekilde yapılandırıldı, bu yüzden rsync komutunu uzak kabuktan çalıştırmak mümkün değildi. Sunucuya erişiminiz varsa / etc / ssh / sshd_config içindeki ForceCommand configuration seçeneğini kontrol edin. Sorun bu olan bir şeye ayarlanmışsa.
devius,

Kayıt için, protokol uyumsuzluğundan vazgeçtiğim bir durumla karşılaştım. rsync --version çıktısı her iki ana bilgisayarda da aynıdır, etkileşimli ve etkileşimli olmayan ssh tamamen sessizdir, onaylanmış anahtarlarda hiçbir şey fantezi değildir ... Sadece çalışmaz. Bu yorumu habbibt holing olanlara bırakıyorum. Kendinize bir iyilik yapın ve --rsync-path olmadan deneyin. Muhtemelen probleminizin bu SO ile ilgisi olmadığını göreceksiniz.
sheldonh

@ sheldonh: Yerel ve uzak makinedeki yol sizin durumunuz için farklı mıydı? benim durumumda zaten aynılar ve vermemek ya da vermemek ( --rsync-path) benim için hiçbir şeyi değiştirmiyor.
0xC0000022L

1
@ 0xC0000022L Üzgünüm, hatırlayamıyorum.
Sheldonh

Yanıtlar:


62

Oturum açma komut dosyalarınızdan biri (.bashrc / .cshrc / etc.) Muhtemelen terminale veri gönderiyordur (olmamalıdır). Bu, ssh'ın bağlanırken hata yapmasına neden olur ve beklememesi gereken ek verileri almaya başladığında kopyalamaya hazır hale gelir. Başlangıç ​​komut dosyalarında oluşturulan çıktıyı kaldırın.

Terminalinizin etkileşimli olup olmadığını ve sadece bashrc içindeki aşağıdaki kodu kullanarak metin çıktısı olup olmadığını kontrol edebilirsiniz. Diğer mermiler için de eşdeğer bir şey var:

if shopt -q login_shell; then
    [any code that outputs text here]
fi

veya alternatif olarak, bunun gibi, çünkü özel parametre , kabuk etkileşimli olduğunda -içerir i:

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

Daha fazla bilgi için bakınız: Linux ile Windows sbs 2003 protokol uyuşmazlığı için ssh ile rsync

Bunu teşhis etmek için, aşağıdakilerin ana bilgisayara ssh girdiğinizde elde ettiğiniz çıktı olduğundan emin olun:

USER@HOSTNAME's password: 
Last login: Mon Nov  7 22:54:30 2011 from YOURIP
[USER@HOSTNAME ~]$ 

Herhangi bir yeni satır veya başka bir veri alırsanız, fazladan çıktı gönderildiğini bilirsiniz. .Bashrc / .cshrc / .profile / etc öğenizi yeniden adlandırabilirsiniz. dosyaları başka bir şeye dönüştürürler böylece fazladan çıktı vermezler. Tabii buna neden olabilecek sistem dosyaları hala var. Bu durumda, sistem dosyalarının veri çıkışı yapmadığını sysadmin'inizle kontrol edin.


5
Bir echoiçinde ~/.bashrc, Thx.
Günümü

19

Bir ssh bağlantısı için kabuğunuzun temiz olup olmadığını test etmenin basit bir yolu vardır: Etkileşimli bir kabuk başlatmak yerine ssh bağlantısından bir komut çalıştırın. falseKomut hemen herhangi bir çıktı üretmeden sona erer, bu yüzden iyi bir testtir:

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash$

Bu komut satırı herhangi bir çıktı veriyorsa, başlangıç ​​komut dosyalarınızdan biri suçlamaktır:

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
Welcome to RemoteHost!

This system is company property and is provided for authorized use only, 
as set forth in applicable written policies. Unauthorized use is prohibited 
and may be subject to discipline, civil suit and criminal prosecution.

Welcome back - You last logged in 16 days ago...
bash$

Bu hatayı alıp almadığınızı kontrol etmek için başka bir şey de, rsync'in ssh tarafından kurulup bulunup bulunmadığıdır:

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
bash$

Rsync yolunda değilse, bunun yerine şuna benzer bir şey göreceksiniz:

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash: rsync: command not found
bash$

Bunu, rsync'i yükleyerek ya da kuruluysa, ancak olağandışı bir konumda, konumu rsync komut satırına geçirerek düzeltebilirsiniz:

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" \
    --rsync-path="/usr/local/bin/rsync" \
    remoteuser@remotehost:/remote/dir /this/dir/

7

Bu genellikle, etkileşimli olmayan bir kabukta bir şeyler çıkaran kabuğunuzun giriş bilgilerinden kaynaklanır. Durumun böyle olup olmadığını test edebilirsiniz:

ssh username@host "/bin/true" > testfile
ls -l testfile

Test dosyası 0 bayt değilse, sorun şu ki kabuğunuz bir şey çıkarıyordur. Kontrol /etc/profile, .profile, .bashrc, .cshrc, vb Eğer öyleyse, size terminali bir bashrc aşağıdaki kodu kullanarak interaktif ve tek çıkış metin olup olmadığını kontrol etmek değiştirebilirsiniz. Diğer mermiler için de eşdeğer bir şey var:

if shopt -q login_shell; then
    [any code that outputs text here]
fi

veya alternatif olarak, bunun gibi, çünkü özel parametre , kabuk etkileşimli olduğunda -içerir i:

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

Bununla birlikte, test dosyası aslında 0 bayt ise, kabuğunuz davranmaktadır, ancak çok eski bir rsync sürümüne sahip olmanız mümkündür. İstemcinin sonuna (yeni bir uç olduğu varsayılarak), eski rysnc sunucu sürümünün tanımadığı kadar yüksek bir sürümün reklamını yapmamasını söyleyebilirsiniz. Bunu --protocol=seçeneği kullanarak yapabilirsiniz . Benim durumumda --protocol=30hile yaptım.

Hala sorun yaşıyorsanız, kullanıcı rsysnc ile bağlantı kurarken ssh'yi deneyin rsync --versionve kabuğun rsync'i bulabildiğini görmek için koşmayı deneyin . Komutun bulunamadığını söyleyen bir şey alırsanız, bağlandığınız makineye rsync yüklenmemiş olabilir ya da yolda olmayabilir. Rsync, uzak ucun yolunu belirlemek için seçeneklere sahiptir, man sayfalarını okuyun.


--protocol2.5.6 sunucusuyla (protokol sürüm 26) ve 3.1.0 istemciyle (protokol sürüm 31) sorunumu çözen ipucu için +1
MattBianco

4

Bu, diğer cevaplardan özel bir durumdur, ancak ondan çok farklı değildir.

Bir rsync'i ssh üzerinden çalıştırmak için, uzak rsync komutunu uygulamak için ssh'de kabuk erişimine ihtiyacınız vardır. Eğer ssh hesabınız sadece scp / sftp'ye izin veriyorsa, rsync kaldırmayı başlatamaz ve bu hatayı veremezsiniz.

Bu, yukarıdakiyle aynı komutla test edilebilir

ssh remotehost false

Bu başarısız olmalı ve bu başarılı olmalı

sftp remotehost

Bu sadece sftp erişimine sahip olduğunuzu kanıtlar.

İstediğiniz ve bunu yapmak için gerekli izinlere varsa düzenleyerek, SFTP bu kullanıcı için sadece erişimini devre dışı bırakabilir /etc/ssh/sshd_configve denetlemek match ve forcecommandgirişleri.

Ayrıca bu kontrol edebilirsiniz yazı


4

Ben aldım protocol version mismatch -- is your shell clean?ben rsync yüklü değil çünkü basitçe diğer Ama işin sonunda. sudo yum install rsyncsorunu çözdü.


Bir konteynerle uğraşırken 30 dakika geçirdi ve Ansible, rsync'in neden işe yaramadığını merak etti ... yüklü değilse çalışması zor! Teşekkürler;)
Ryan Fisher

2

Komut, doğrudan bir komut yürütülürken ve etkileşimli olmayan bir şekilde hiçbir zaman gösterilmez. Basit bir google ilk sonucu ortaya çıkarır: http://marc.info/?l=rsync&m=100263876212594&w=2 Kabuk potansiyel olarak çağrılabildiğinden, etkileşimli olmayan modda hiçbir şey göstermemelidir - tıpkı, sadece "yazarken" mevcut bir bilgi istemine bash, yeni bilgi isteminin dışında hiçbir şey görünmemeli.


Belki de yeterince açıklığa kavuşturmadım ama bu "istemi (PS1 =" ") ve motd'i (.hushlogin)" zaten yaptım. Giriş gerçekten herhangi bir bilgi istemiyor. Buna rağmen protokol uyumsuzluğu hatası hala görünüyor. Yine de teşekkürler - öneri için teşekkür ederiz.
rfreytag,

Temel olarak bundan zaten bahsettiniz, ancak .bashrc'de (veya diğer profil komut dosyasında) herhangi bir şeyi ekrana ekleyen herhangi bir şey varsa, bunun gibi problemler yaşadım. Bazı programları belirli bir şekilde değiştiren kabuğun içinde bazı programları çalıştırırken bile bu tür bir sorun yaşadım (örneğin, kabuğumu chsh ile değiştiremedim, bu yüzden benim. shell ve ssh artık işe yaramazdı).
lsd

Bu kesinlikle ilginç. Rsync komutunu yürütmek etkileşimli olarak ekranda yankılanan hiçbir şey göstermediğinden ve giriş tamamen sessiz olduğundan bunu nasıl teşhis edebilirim acaba? Hmmm ... İstediğiniz gibi kabukla ilgili yanlış bir şeyler olup olmadığını merak ediyorum. Teşekkürler.
rfreytag

1

Bu, RSYNC'in beklemeyeceği “Parolanız 6 gün içinde sona eriyor” gibi uzaktaki bir bilgisayardaki oturum açma mesajından kaynaklanabilir.

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.