phiên bản giao thức không khớp - vỏ của bạn có sạch không?


55

Khi làm theo các hướng dẫn để thực hiện sao lưu rsync được cung cấp tại đây: http://troy.jdmz.net/rsync/index.html

Tôi nhận được lỗi "phiên bản giao thức không khớp - vỏ của bạn có sạch không?"

Tôi đã đọc ở đâu đó rằng tôi cần phải tắt tiếng nhắc (PS1 = "") và hiển thị motd (.hushlogin) để giải quyết vấn đề này. Tôi đã thực hiện điều này, biểu ngữ nhắc nhở và đăng nhập (MOTD) không còn xuất hiện nữa, nhưng lỗi vẫn xuất hiện khi tôi chạy:

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

Cả máy khách ssh và máy chủ sshd đều đang sử dụng phiên bản 2 của giao thức.

Điều gì có thể là vấn đề? Cảm ơn.

[EDIT] Tôi đã tìm thấy http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html chỉ dẫn rằng đôi khi cần phải "Buộc v2 bằng cách sử dụng cờ -2 để ssh hoặc slogin

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

Không rõ điều này đã giải quyết vấn đề vì tôi nghĩ rằng tôi đã đặt thay đổi này trong SAU lỗi đã thay đổi nhưng thực tế là lỗi đã phát triển sang một thứ khác. Tôi sẽ cập nhật điều này khi tôi tìm hiểu thêm. Và tôi chắc chắn sẽ thử gợi ý để chạy cái này trong vỏ emacs - cảm ơn bạn.


1
Các tập lệnh đăng nhập của bạn có xuất ra thứ gì đó không hiển thị ngay lập tức không, ví dụ lệnh thay đổi tiêu đề cửa sổ? Một cách để kiểm tra điều này là chạy Emacs, gõ ESC x shellvà làm export TERM=xterm; ssh remotehost ls. Nếu bất kỳ ký tự điều khiển hoặc đầu ra giả nào khác xuất hiện, đó là những gì bạn phải tìm kiếm.
Gilles 'SO- ngừng trở nên xấu xa'

1
Tôi đã có cùng một vấn đề. Trong trường hợp của tôi, máy chủ SSH được cấu hình để chroot người dùng và chỉ cho phép truy cập SFTP để không thể chạy lệnh rsync từ trình vỏ từ xa. Nếu bạn có quyền truy cập vào máy chủ, hãy kiểm tra tùy chọn cấu hình ForceCommand trong / etc / ssh / sshd_config. Nếu nó được đặt thành một cái gì đó là vấn đề.
devius

Đối với hồ sơ, tôi đã gặp phải một tình huống mà tôi vừa từ bỏ với một giao thức không khớp. rsync - đầu ra đảo ngược giống hệt nhau trên cả hai máy chủ, ssh tương tác và không tương tác hoàn toàn im lặng, không có gì lạ mắt trong ủy quyền ... Chỉ không hoạt động. Tôi để lại bình luận này cho những người khác là rabbibt holing. Làm cho mình một ưu tiên và thử mà không có --rsync-path. Có lẽ bạn sẽ thấy vấn đề của mình không liên quan gì đến SO này.
sheldonh

@sheldonh: đường dẫn trên máy cục bộ và máy từ xa có khác nhau không? trong trường hợp của tôi dù sao họ cũng giống nhau và cho hay không cho ( --rsync-path) không thay đổi điều gì đối với tôi.
0xC0000022L

1
@ 0xC0000022L Xin lỗi, tôi không thể nhớ.
sheldonh

Câu trả lời:


62

Một trong những tập lệnh đăng nhập của bạn (.bashrc / .cshrc / vv.) Có thể xuất dữ liệu đến thiết bị đầu cuối (khi không nên). Điều này gây ra lỗi ssh khi kết nối và sẵn sàng sao chép khi nó bắt đầu nhận thêm dữ liệu mà nó không mong đợi. Loại bỏ đầu ra được tạo ra trong các kịch bản khởi động.

Bạn có thể kiểm tra xem thiết bị đầu cuối của bạn có tương tác hay không và chỉ xuất văn bản bằng cách sử dụng mã sau trong bashrc. Một cái gì đó tương đương tồn tại cho các shell khác:

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

hoặc cách khác, như thế này, vì tham số đặc biệt -chứa ikhi shell tương tác:

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

Để biết thêm thông tin, hãy xem: rsync qua ssh từ linux đến windows sbs 2003 giao thức không khớp

Để chẩn đoán điều này, hãy đảm bảo rằng sau đây là đầu ra bạn nhận được khi bạn ssh vào máy chủ:

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

Nếu bạn nhận được bất kỳ dòng mới hoặc dữ liệu khác, bạn biết rằng đầu ra thêm đang được gửi. Bạn có thể đổi tên .bashrc / .cshrc / .profile / của bạn. tập tin vào một cái gì đó khác để họ sẽ không xuất thêm đầu ra. Tất nhiên vẫn còn các tập tin hệ thống có thể gây ra điều này. Trong trường hợp đó, hãy kiểm tra với sysadmin của bạn rằng các tệp hệ thống không xuất dữ liệu.


5
An echotrong ~/.bashrc, Thx. Bạn đã thực hiện một ngày của tôi
user9869932

19

Có một cách đơn giản để kiểm tra xem shell của bạn có sạch không, đối với kết nối ssh: chạy lệnh từ kết nối ssh, thay vì bắt đầu shell tương tác. Các falselệnh sẽ ngay lập tức chấm dứt mà không sản xuất bất kỳ sản lượng, vì vậy nó là một thử nghiệm tốt:

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

Nếu dòng lệnh đó tạo ra bất kỳ đầu ra nào, một trong các tập lệnh khởi động của bạn là để đổ lỗi:

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$

Một điều khác để kiểm tra xem bạn có đang gặp lỗi này hay không là liệu rsync có được cài đặt và định vị bằng ssh không:

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$

Nếu rsync không có trong đường dẫn, thay vào đó bạn sẽ thấy một cái gì đó như:

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

Bạn có thể khắc phục điều này bằng cách cài đặt rsync hoặc nếu nó được cài đặt nhưng ở một vị trí không bình thường, chuyển vị trí đến dòng lệnh rsync:

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

7

Điều này thường được gây ra bởi công cụ đăng nhập của trình bao của bạn xuất nội dung trên trình bao không tương tác. Bạn có thể kiểm tra nếu đây là trường hợp bằng cách làm:

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

Nếu testfile KHÔNG phải là 0 byte, thì rắc rối là shell của bạn đang xuất ra thứ gì đó. Kiểm tra /etc/profile, .profile, .bashrc, .cshrc, vv Nếu có, bạn có thể thay đổi nó để kiểm tra xem thiết bị đầu cuối của bạn là tương tác và chỉ ra văn bản bằng cách sử dụng đoạn mã sau vào một bashrc. Một cái gì đó tương đương tồn tại cho các shell khác:

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

hoặc cách khác, như thế này, vì tham số đặc biệt -chứa ikhi shell tương tác:

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

Tuy nhiên, nếu tệp thử nghiệm thực tế là 0 byte, thì shell của bạn đang hoạt động, nhưng có thể bạn chỉ có một phiên bản rsync rất cũ. Bạn có thể nói với khách hàng kết thúc (giả sử đó là kết thúc mới hơn) không quảng cáo phiên bản cao đến mức phiên bản máy chủ rysnc cũ không nhận ra. Bạn có thể làm điều này bằng cách sử dụng --protocol=tùy chọn. Trong trường hợp của tôi, sử dụng --protocol=30đã lừa

Nếu bạn vẫn gặp sự cố, hãy thử ssh vì người dùng rsysnc đang kết nối và thử chạy rsync --versionđể xem shell có thể tìm thấy rsync không. Nếu bạn nhận được thông báo không tìm thấy lệnh, thì rsync có thể không được cài đặt trên máy bạn đang kết nối hoặc có thể không có trong đường dẫn. Rsync có các tùy chọn để chỉ định đường dẫn của đầu từ xa, hãy đọc (các) trang man.


+1 cho gợi ý về cách --protocolgiải quyết vấn đề của tôi với máy chủ 2.5.6 (phiên bản giao thức 26) và máy khách 3.1.0 (phiên bản giao thức 31)
MattBianco

4

Đây là một trường hợp đặc biệt từ các trả lời khác, nhưng không khác lắm so với sau đó.

Để thực thi rsync thông qua ssh, bạn cần truy cập shell trong ssh để thực thi lệnh rsync từ xa. Nếu tài khoản ssh của bạn chỉ cho phép scp / sftp, bạn sẽ không thể bắt đầu xóa rsync và không đưa ra lỗi này.

Điều này có thể được kiểm tra với cùng một lệnh như trên

ssh remotehost false

Cái này nên thất bại và cái này nên thành công

sftp remotehost

Điều này chứng tỏ rằng bạn chỉ có quyền truy cập sftp.

Nếu bạn muốn và có quyền làm như vậy, bạn có thể vô hiệu hóa quyền truy cập chỉ sftp cho người dùng đó, bằng cách chỉnh sửa /etc/ssh/sshd_configvà kiểm tra matchforcecommandnhập.

Bạn cũng có thể kiểm tra bài này


4

Tôi nhận được protocol version mismatch -- is your shell clean?đơn giản vì tôi chưa cài đặt rsync ở đầu bên kia . sudo yum install rsyncĐã giải quyết vấn đề.


Đã dành 30 phút lộn xộn với một container và Ansible tự hỏi tại sao rsync không hoạt động ... khó để nó hoạt động khi nó không được cài đặt! Cảm ơn;)
Ryan Fisher

2

Lời nhắc sẽ hoàn toàn không được hiển thị khi thực hiện trực tiếp một lệnh và không tương tác như vậy. Một google đơn giản xuất hiện kết quả đầu tiên: http://marc.info/?l=rsync&m=100263876212594&w=2 Và vì trình bao có thể có khả năng được gọi, nó không được hiển thị bất cứ điều gì trong chế độ không tương tác - như, khi chỉ cần gõ " bash "vào một dấu nhắc hiện có, không có gì ngoài dấu nhắc mới sẽ xuất hiện.


Có lẽ tôi đã không làm cho nó đủ rõ ràng nhưng tôi đã thực hiện "nhắc nhở (PS1 =" ") và motd (.hushlogin)" này. Việc đăng nhập thực sự không hiển thị bất kỳ lời nhắc. Mặc dù vậy, lỗi không khớp giao thức vẫn xuất hiện. Cảm ơn mặc dù - nhiều đánh giá cao đề nghị.
rfreytag

Về cơ bản bạn đã đề cập đến vấn đề này rồi, nhưng tôi đã gặp vấn đề như thế này nếu có bất cứ điều gì trong .bashrc (hoặc tập lệnh hồ sơ khác) lặp lại bất cứ điều gì trên màn hình. Tôi thậm chí đã gặp phải vấn đề này khi chạy một số chương trình trong trình bao thay đổi mọi thứ theo một cách nhất định (ví dụ: tôi không thể thay đổi trình bao của mình bằng chsh, vì vậy tôi đã chạy .cshrc để bash để thay đổi shell, và ssh sẽ không hoạt động nữa).
lsd

Vâng, điều đó chắc chắn là thú vị. Tôi tự hỏi làm thế nào tôi có thể chẩn đoán điều này kể từ khi thực hiện lệnh rsync tương tác cho thấy không có gì lặp lại trên màn hình và đăng nhập hoàn toàn im lặng? Hmmm ... tôi tự hỏi nếu có cái gì đó không ổn với vỏ như bạn đề nghị. Cảm ơn.
rfreytag

1

Điều này có thể do thông báo đăng nhập trên máy chủ từ xa, chẳng hạn như "Mật khẩu của bạn sẽ hết hạn sau 6 ngày nữa" mà RSYNC không mong đợi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.