versi protokol tidak cocok - apakah shell Anda bersih?

55

Saat mengikuti petunjuk untuk melakukan backup rsync yang diberikan di sini: http://troy.jdmz.net/rsync/index.html

Saya mendapatkan kesalahan "versi protokol tidak cocok - apakah shell Anda bersih?"

Saya membaca di suatu tempat bahwa saya perlu membungkam tampilan prompt (PS1 = "") dan motd (.hushlogin) untuk menangani ini. Saya telah melakukan ini, prompt dan banner masuk (MOTD) tidak lagi muncul, tetapi kesalahan masih muncul ketika saya menjalankan:

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

Baik ssh client maupun sshd server menggunakan versi 2 protokol.

Apa yang bisa menjadi masalah? Terima kasih.

[EDIT] Saya telah menemukan http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html yang mengarahkan bahwa kadang-kadang diperlukan untuk "Memaksa v2 dengan menggunakan flag -2 ke ssh atau slogin

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

Tidak jelas ini menyelesaikan masalah karena saya pikir saya menempatkan perubahan ini SETELAH kesalahan berubah tetapi faktanya kesalahan telah berkembang menjadi sesuatu yang lain. Saya akan memperbarui ini ketika saya belajar lebih banyak. Dan saya pasti akan mencoba saran untuk menjalankan ini di shell emacs - terima kasih.

rfreytag
sumber
1
Apakah skrip login Anda menghasilkan sesuatu yang tidak segera terlihat, misalnya perintah mengubah judul jendela? Salah satu cara untuk memeriksa ini adalah dengan menjalankan Emacs, ketik ESC x shell, dan lakukan export TERM=xterm; ssh remotehost ls. Jika ada karakter kontrol atau output palsu lainnya muncul, itulah yang harus Anda cari.
Gilles 'SO- stop being evil'
1
Saya mengalami masalah yang sama. Dalam kasus saya server SSH dikonfigurasikan untuk chroot pengguna dan hanya mengizinkan akses SFTP sehingga tidak mungkin untuk menjalankan perintah rsync dari shell jauh. Jika Anda memiliki akses ke server, periksa opsi konfigurasi ForceCommand di / etc / ssh / sshd_config. Jika diatur ke sesuatu itulah masalahnya.
devius
Sebagai catatan, saya telah mengalami situasi di mana saya baru saja menyerah dengan ketidakcocokan protokol. rsync - output konversi identik pada kedua host, ssh interaktif dan non-interaktif benar-benar diam, tidak ada yang mewah di otor_keys ... Hanya tidak berfungsi. Saya meninggalkan komentar ini untuk orang lain yang rabbibt holing. Bantulah diri Anda dan cobalah tanpa --rsync-path. Anda mungkin akan menemukan masalah Anda tidak ada hubungannya dengan SO ini.
sheldonh
@sheldonh: apakah jalur pada mesin lokal dan jarak jauh berbeda dalam kasus Anda? dalam kasus saya mereka tetap sama dan memberi atau tidak memberikan ( --rsync-path) tidak mengubah apa pun untuk saya.
0xC0000022L
1
@ 0xC0000022L Maaf, saya tidak ingat.
sheldonh

Jawaban:

62

Salah satu skrip login Anda (.bashrc / .cshrc / etc.) Mungkin mengeluarkan data ke terminal (padahal seharusnya tidak). Ini menyebabkan ssh salah ketika terhubung dan bersiap-siap untuk menyalin ketika mulai menerima data tambahan yang tidak diharapkan. Hapus output yang dihasilkan dalam skrip startup.

Anda dapat memeriksa apakah terminal Anda interaktif dan hanya menghasilkan teks dengan menggunakan kode berikut dalam bashrc. Sesuatu yang setara juga ada untuk shell lainnya:

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

atau sebagai alternatif, seperti ini, karena parameter khusus -berisi iketika shell bersifat interaktif:

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

Untuk informasi lebih lanjut, lihat: rsync via ssh dari linux ke windows sbs 2003 protokol mismatch

Untuk mendiagnosis ini, pastikan bahwa berikut ini adalah output yang Anda dapatkan ketika Anda ssh in ke host:

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

Jika Anda mendapatkan baris baru atau data lain, Anda tahu bahwa output tambahan sedang dikirim. Anda dapat mengganti nama .bashrc / .cshrc / .profile / etc. file ke sesuatu yang lain sehingga mereka tidak akan menampilkan output tambahan. Tentu saja masih ada file sistem yang dapat menyebabkan ini. Dalam hal ini, periksa dengan sysadmin Anda bahwa file sistem tidak menampilkan data.

Andrew Case
sumber
5
Sebuah echodi ~/.bashrc, Thx. Anda membuat hari saya
user9869932
19

Ada cara sederhana untuk menguji apakah shell Anda bersih, untuk koneksi ssh: jalankan perintah dari koneksi ssh, daripada memulai shell interaktif. The falseperintah akan segera mengakhiri tanpa menghasilkan output apapun, sehingga merupakan tes yang baik:

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

Jika baris perintah itu menghasilkan output apa pun, salah satu skrip startup Anda adalah yang harus disalahkan:

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$

Hal lain untuk memeriksa apakah Anda mendapatkan kesalahan ini adalah apakah rsync diinstal dan dapat dilacak oleh ssh:

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$

Jika rsync tidak ada di jalur, Anda akan melihat sesuatu seperti:

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

Anda dapat memperbaikinya dengan menginstal rsync, atau jika diinstal tetapi di lokasi yang tidak biasa, meneruskan lokasi ke baris perintah rsync:

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

Ini biasanya disebabkan oleh barang-barang login shell Anda yang menghasilkan barang-barang di shell non-interaktif. Anda dapat menguji apakah ini masalahnya dengan melakukan:

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

Jika testfile BUKAN 0 byte, maka masalahnya adalah shell Anda mengeluarkan sesuatu. Periksa /etc/profile, .profile, .bashrc, .cshrc, dll Jika ya, Anda dapat mengubahnya untuk memeriksa apakah terminal Anda interaktif dan hanya menampilkan teks dengan menggunakan kode berikut di bashrc a. Sesuatu yang setara juga ada untuk shell lainnya:

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

atau sebagai alternatif, seperti ini, karena parameter khusus -berisi iketika shell bersifat interaktif:

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

Namun, jika file tes sebenarnya 0 byte, maka shell Anda berperilaku, tetapi ada kemungkinan bahwa Anda hanya memiliki versi rsync yang sangat lama. Anda dapat memberi tahu ujung klien (dengan asumsi itu adalah ujung yang lebih baru) untuk tidak mengiklankan versi yang sedemikian tinggi sehingga versi server rysnc yang lama tidak mengenalinya. Anda dapat melakukan ini menggunakan --protocol=opsi. Dalam kasus saya, menggunakan --protocol=30melakukan trik.

Jika Anda masih mengalami masalah, coba ssh saat pengguna terhubung dengan rsysnc dan coba jalankan rsync --versionuntuk melihat apakah shell dapat menemukan rsync. Jika Anda mendapatkan sesuatu yang mengatakan perintah tidak ditemukan, maka rsync mungkin tidak diinstal pada mesin yang Anda sambungkan atau mungkin tidak ada di jalur. Rsync memang memiliki opsi untuk menentukan jalur ujung jarak jauh, baca halaman manual.

Azendale
sumber
+1 untuk petunjuk tentang --protocolyang memecahkan masalah saya dengan server 2.5.6 (versi protokol 26) dan klien 3.1.0 (versi protokol 31)
MattBianco
4

Ini adalah kasus khusus dari balasan lain, tetapi tidak jauh berbeda dari itu.

Untuk menjalankan rsync melalui ssh, Anda perlu akses shell di ssh untuk menjalankan perintah rsync jarak jauh. Jika akun ssh Anda hanya memungkinkan scp / sftp, Anda tidak akan dapat memulai menghapus rsync dan gagal memberikan kesalahan ini.

Ini dapat diuji dengan perintah yang sama seperti di atas

ssh remotehost false

Yang ini harusnya gagal dan yang ini harusnya sukses

sftp remotehost

Ini membuktikan bahwa Anda hanya memiliki akses sftp.

Jika Anda ingin dan memiliki izin untuk melakukannya, Anda dapat menonaktifkan akses hanya sftp untuk pengguna itu, dengan mengedit /etc/ssh/sshd_configdan memeriksa match dan forcecommandentri.

Anda juga dapat memeriksa pos ini

higuita
sumber
4

Aku protocol version mismatch -- is your shell clean?hanya karena aku tidak diinstal rsync di lain akhir belum. sudo yum install rsyncmemecahkan masalah.

Kjetil S.
sumber
Menghabiskan 30 menit bermain-main dengan sebuah wadah dan Kemungkinan bertanya-tanya mengapa rsync tidak bekerja ... sulit baginya untuk bekerja ketika itu tidak diinstal! Terima kasih;)
Ryan Fisher
2

Prompt tidak akan ditampilkan sama sekali ketika langsung menjalankan perintah, dan secara non-interaktif. Google sederhana menghasilkan hasil pertama: http://marc.info/?l=rsync&m=100263876212594&w=2 Dan karena shell dapat berpotensi dipanggil, ia tidak boleh menampilkan apa pun dalam mode non-interaktif - seperti, saat mengetik " bash "menjadi prompt yang ada, tidak ada yang muncul kecuali prompt baru.

dgq8
sumber
Mungkin saya tidak membuatnya cukup jelas tetapi saya sudah melakukan ini "prompt (PS1 =" ") dan motd (.hushlogin)". Login memang tidak menampilkan prompt. Meskipun demikian kesalahan protokol mismatch masih muncul. Terima kasih - sangat menghargai saran ini.
rfreytag
Anda pada dasarnya sudah menyebutkan ini, tapi saya punya masalah seperti ini jika ada sesuatu di .bashrc (atau skrip profil lainnya) yang menggema apapun ke layar. Saya bahkan memiliki masalah seperti ini ketika menjalankan program tertentu di shell yang mengubah hal-hal dengan cara tertentu (misalnya, saya tidak dapat mengganti shell saya dengan chsh, jadi saya minta .cshrc run bash saya untuk mengubah shell, dan ssh tidak akan berfungsi lagi).
lsd
Nah itu tentu menarik. Saya bertanya-tanya bagaimana saya bisa mendiagnosis hal ini sejak menjalankan perintah rsync secara interaktif tidak menunjukkan apa-apa bergema ke layar dan login benar-benar diam? Hmmm ... Saya ingin tahu apakah ada sesuatu yang salah dengan shell seperti yang Anda sarankan. Terima kasih.
rfreytag
1

Ini dapat disebabkan oleh pesan masuk pada host jarak jauh seperti "Kata sandi Anda akan kedaluwarsa dalam 6 hari" yang tidak diharapkan RSYNC

Dief
sumber