โปรโตคอลรุ่นไม่ตรงกัน - เปลือกของคุณสะอาดหรือไม่


55

เมื่อทำตามคำแนะนำในการสำรองข้อมูล rsync ที่ระบุไว้ที่นี่: http://troy.jdmz.net/rsync/index.html

ฉันได้รับข้อผิดพลาด "โปรโตคอลรุ่นไม่ตรงกัน - เปลือกของคุณสะอาดหรือไม่"

ฉันอ่านบางแห่งที่ฉันต้องการปิดเสียงพรอมต์ (PS1 = "") และ motd (.hushlogin) แสดงขึ้นเพื่อจัดการกับสิ่งนี้ ฉันได้ทำสิ่งนี้แล้วพรอมต์และล็อกอินแบนเนอร์ (MOTD) จะไม่ปรากฏอีกต่อไป แต่ข้อผิดพลาดยังคงปรากฏขึ้นเมื่อฉันเรียกใช้

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

ทั้งไคลเอ็นต์ ssh และเซิร์ฟเวอร์ sshd กำลังใช้โปรโตคอลรุ่น 2

มีปัญหาอะไรบ้าง? ขอบคุณ

[แก้ไข] ฉันพบhttp://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html ซึ่งชี้ให้เห็นว่าบางครั้งมันจำเป็นต้อง "บังคับ v2 โดยใช้แฟล็ก -2 เพื่อ ssh หรือ slogin

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

ไม่ชัดเจนว่านี่เป็นการแก้ไขปัญหาเนื่องจากฉันคิดว่าฉันเปลี่ยนการเปลี่ยนแปลงนี้ในภายหลังหลังจากที่ข้อผิดพลาดเปลี่ยนไป แต่ความจริงก็คือข้อผิดพลาดได้เปลี่ยนไปเป็นอย่างอื่น ฉันจะอัปเดตสิ่งนี้เมื่อฉันเรียนรู้เพิ่มเติม และแน่นอนฉันจะลองใช้คำแนะนำเพื่อเรียกใช้งานในเชลล์ emacs - ขอบคุณ


1
สคริปต์ล็อกอินของคุณแสดงผลบางสิ่งที่ไม่สามารถมองเห็นได้ทันทีเช่นคำสั่งเปลี่ยนชื่อหน้าต่างหรือไม่? วิธีหนึ่งในการตรวจสอบเรื่องนี้คือการทำงาน Emacs ชนิดและทำESC x shell export TERM=xterm; ssh remotehost lsหากตัวควบคุมหรือเอาต์พุตปลอมอื่น ๆ ปรากฏขึ้นนั่นคือสิ่งที่คุณต้องตามล่า
Gilles 'หยุดความชั่วร้าย' ใน

1
ฉันมีปัญหาเดียวกัน ในกรณีของฉันเซิร์ฟเวอร์ SSH ได้รับการกำหนดค่าให้กับผู้ใช้ chroot และอนุญาตการเข้าถึง SFTP เท่านั้นจึงไม่สามารถเรียกใช้คำสั่ง rsync จากเปลือกระยะไกล หากคุณมีสิทธิ์เข้าถึงเซิร์ฟเวอร์ให้ตรวจสอบตัวเลือกการกำหนดค่า ForceCommand ใน / etc / ssh / sshd_config ถ้ามันถูกตั้งค่าเป็นสิ่งที่เป็นปัญหา
devius

สำหรับบันทึกแล้วฉันพบกับสถานการณ์ที่ฉันเพิ่งล้มเลิกโปรโตคอลที่ไม่ตรงกัน rsync - เอาต์พุตรุ่นเหมือนกันทั้งบนโฮสต์, ssh แบบอินเทอร์แอคทีฟและไม่มีการโต้ตอบอย่างสมบูรณ์, ไม่มีอะไรแฟนซีใน authorized_keys ... แค่ใช้งานไม่ได้ ฉันออกความคิดเห็นนี้สำหรับคนอื่น ๆ ที่แรบบิทโฮลดิ้ง ทำสิ่งที่ชอบและลองทำโดยไม่มี --rsync-path คุณอาจจะพบว่าปัญหาของคุณไม่เกี่ยวกับเรื่องนี้
เชลดอน

@sheldonh: เส้นทางในเครื่องท้องถิ่นและระยะไกลแตกต่างกันในกรณีของคุณหรือไม่ ในกรณีของฉันมันเหมือนกันอยู่แล้วและการให้หรือไม่ให้ ( --rsync-path) ไม่เปลี่ยนสิ่งสำหรับฉัน
0xC0000022L

1
@ 0xC0000022L ขออภัยฉันจำไม่ได้
เชลดอน

คำตอบ:


62

หนึ่งในสคริปต์การเข้าสู่ระบบของคุณ (.bashrc / .cshrc / etc.) อาจส่งออกข้อมูลไปยังเทอร์มินัล (เมื่อไม่ควร) นี่เป็นสาเหตุให้ ssh เกิดข้อผิดพลาดเมื่อเชื่อมต่อและเตรียมพร้อมที่จะคัดลอกเมื่อเริ่มรับข้อมูลพิเศษที่ไม่คาดคิด ลบเอาต์พุตที่สร้างขึ้นในสคริปต์เริ่มทำงาน

คุณสามารถตรวจสอบว่าเทอร์มินัลของคุณเป็นแบบโต้ตอบและส่งออกข้อความโดยใช้รหัสต่อไปนี้ใน bashrc มีบางสิ่งที่เทียบเท่ากับกระสุนอื่น ๆ เช่นกัน:

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

หรืออีกทางหนึ่งเช่นนี้เนื่องจากพารามิเตอร์พิเศษ-ประกอบด้วยiเมื่อเชลล์เป็นแบบโต้ตอบ:

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

สำหรับข้อมูลเพิ่มเติมดูที่: rsync ผ่าน ssh จาก linux ไปยัง windows sbs 2003 โปรโตคอลไม่ตรงกัน

ในการวิเคราะห์สิ่งนี้ตรวจสอบให้แน่ใจว่าสิ่งต่อไปนี้เป็นผลลัพธ์ที่คุณได้รับเมื่อคุณเข้าสู่โฮสต์:

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

หากคุณได้รับบรรทัดใหม่หรือข้อมูลอื่น ๆ คุณรู้ว่ากำลังส่งเอาต์พุตพิเศษ คุณสามารถเปลี่ยนชื่อ. bashrc / .cshrc / .profile / etc ไฟล์ไปยังอย่างอื่นเพื่อที่พวกเขาจะไม่ส่งออกผลผลิตพิเศษ แน่นอนว่ายังมีไฟล์ระบบที่อาจทำให้เกิดปัญหานี้ ในกรณีดังกล่าวให้ตรวจสอบระบบดูแลระบบของคุณว่าไฟล์ระบบไม่ส่งข้อมูลออก


5
อันechoใน~/.bashrc, ขอบคุณ คุณทำให้วันของฉัน
user9869932

19

มีวิธีง่าย ๆ ในการทดสอบว่าเชลล์ของคุณสะอาดหรือไม่สำหรับการเชื่อมต่อ ssh: รันคำสั่งจากการเชื่อมต่อ ssh แทนที่จะเริ่มต้นเชลล์แบบโต้ตอบ falseคำสั่งจะยุติลงทันทีโดยไม่มีผลใด ๆ ดังนั้นจึงเป็นการทดสอบที่ดี:

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

หากบรรทัดคำสั่งนั้นสร้างเอาต์พุตใด ๆ สคริปต์เริ่มต้นตัวใดตัวหนึ่งของคุณคือการตำหนิ:

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$

อีกสิ่งหนึ่งในการตรวจสอบว่าคุณได้รับข้อผิดพลาดนี้หรือไม่คือติดตั้ง rsync และ locatable โดย 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$

หาก rsync ไม่ได้อยู่ในเส้นทางคุณจะเห็นสิ่งต่อไปนี้แทน:

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

คุณสามารถแก้ไขได้โดยการติดตั้ง rsync หรือติดตั้ง แต่ในตำแหน่งที่ผิดปกติผ่านตำแหน่งไปยังบรรทัดคำสั่ง 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

สิ่งนี้มักเกิดจากสิ่งที่ล็อกอินของเชลล์ของคุณส่งออกข้อมูลบนเชลล์ที่ไม่มีการโต้ตอบ คุณสามารถทดสอบว่าเป็นกรณีนี้หรือไม่โดยทำ:

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

หาก testfile ไม่ใช่ 0 ไบต์ปัญหาก็คือเปลือกของคุณกำลังแสดงผลบางอย่าง ตรวจสอบ/etc/profile, .profile, .bashrc, .cshrcฯลฯ หากเป็นเช่นนั้นคุณสามารถเปลี่ยนได้เพื่อตรวจสอบว่า terminal ของคุณคือข้อความการส่งออกและการโต้ตอบโดยเฉพาะการใช้รหัสต่อไปนี้ใน bashrc มีบางสิ่งที่เทียบเท่าสำหรับกระสุนอื่น ๆ เช่นกัน:

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

หรืออีกทางหนึ่งเช่นนี้เนื่องจากพารามิเตอร์พิเศษ-ประกอบด้วยiเมื่อเชลล์เป็นแบบโต้ตอบ:

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

อย่างไรก็ตามหากไฟล์ทดสอบนั้นมีขนาด 0 ไบต์เชลล์ของคุณจะทำงาน แต่เป็นไปได้ว่าคุณมี rsync เวอร์ชันเก่ามาก คุณสามารถบอกลูกค้าปลายทาง (สมมติว่ามันเป็นปลายทางที่ใหม่กว่า) เพื่อไม่โฆษณารุ่นสูงดังกล่าวที่รุ่นเซิร์ฟเวอร์ rysnc เก่าไม่รู้จัก คุณสามารถทำได้โดยใช้--protocol=ตัวเลือก ในกรณีของฉันการใช้--protocol=30กลอุบายทำได้

หากคุณยังคงมีปัญหาลอง ssh ในขณะที่ผู้ใช้ rsysnc เชื่อมต่อกับและลองเรียกใช้rsync --versionเพื่อดูว่าเปลือกสามารถหา rsync หากคุณพบสิ่งที่ระบุว่าไม่พบคำสั่งแสดงว่า rsync อาจไม่ได้รับการติดตั้งบนเครื่องที่คุณกำลังเชื่อมต่อหรืออาจไม่ได้อยู่ในเส้นทาง Rsync มีตัวเลือกสำหรับระบุเส้นทางของปลายทางระยะไกลอ่าน man page (s)


+1 สำหรับคำแนะนำเกี่ยวกับ--protocolสิ่งที่แก้ไขปัญหาของฉันกับเซิร์ฟเวอร์ 2.5.6 (รุ่นโปรโตคอล 26) และลูกค้า 3.1.0 (รุ่นโปรโตคอล 31)
MattBianco

4

นี่เป็นกรณีพิเศษจากการตอบกลับอื่น ๆ แต่ไม่แตกต่างจากตอนนั้น

ในการเรียกใช้ rsync ผ่าน ssh คุณจะต้องเข้าถึงเชลล์ใน ssh เพื่อดำเนินการคำสั่งระยะไกล rsync หากบัญชี ssh ของคุณอนุญาตเฉพาะ scp / sftp คุณจะไม่สามารถเริ่มการลบ rsync และล้มเหลวในการให้ข้อผิดพลาดนี้

สิ่งนี้สามารถทดสอบได้ด้วยคำสั่งเดียวกับข้างบน

ssh remotehost false

อันนี้ควรล้มเหลวและอันนี้ควรจะสำเร็จ

sftp remotehost

นี่เป็นการพิสูจน์ว่าคุณมีการเข้าถึง sftp เท่านั้น

หากคุณต้องการและมีสิทธิ์ที่จะทำเช่นนั้นคุณสามารถปิดการใช้งาน SFTP เพียงการเข้าถึงสำหรับผู้ใช้ที่ได้โดยการแก้ไข/etc/ssh/sshd_configและตรวจสอบmatch และforcecommandรายการ

คุณสามารถตรวจสอบโพสต์นี้


4

ฉันได้รับprotocol version mismatch -- is your shell clean?เพียงเพราะฉันยังไม่ได้ติดตั้ง rsync ที่ปลายอีกด้าน sudo yum install rsyncแก้ไขปัญหา


ใช้เวลา 30 นาทีล้อกับภาชนะและสงสัยว่าทำไม rsync ไม่ทำงาน ... มันยากที่จะทำงานเมื่อมันไม่ได้ติดตั้ง! ขอบคุณ;)
Ryan Fisher

2

พรอมต์จะไม่ปรากฏเลยเมื่อเรียกใช้คำสั่งโดยตรงและไม่โต้ตอบดังนั้น ผลการค้นหาของ Google แบบง่าย ๆ คือhttp://marc.info/?l=rsync&m=100263876212594&w=2 และเนื่องจากเชลล์สามารถเรียกใช้งานได้จึงไม่ต้องแสดงสิ่งใดในโหมดที่ไม่โต้ตอบเช่นเมื่อพิมพ์เพียง " ทุบตี "ลงในพรอมต์ที่มีอยู่ไม่มีอะไรนอกจากพรอมต์ใหม่ควรปรากฏขึ้น


บางทีฉันไม่ได้ทำให้มันชัดเจนเพียงพอ แต่ฉันได้ทำ "พรอมต์ (PS1 =" ") นี้และ motd (.hushlogin) แล้ว" การเข้าสู่ระบบไม่แสดงพรอมต์ใด ๆ อย่างไรก็ตามข้อผิดพลาดที่ไม่ตรงกันของโปรโตคอลยังคงปรากฏขึ้น ขอบคุณแม้ว่า - ขอขอบคุณข้อเสนอแนะ
rfreytag

โดยทั่วไปคุณพูดถึงเรื่องนี้แล้ว แต่ฉันมีปัญหาเช่นนี้หากมีอะไรใน. bashrc (หรือสคริปต์โปรไฟล์อื่น ๆ ) ที่สะท้อนทุกสิ่งบนหน้าจอ ฉันยังมีปัญหาแบบนี้เมื่อใช้งานโปรแกรมบางอย่างในเชลล์ที่เปลี่ยนแปลงสิ่งต่าง ๆ ในลักษณะที่แน่นอน (ตัวอย่างเช่นฉันไม่สามารถเปลี่ยนเชลล์ด้วย chsh ได้ดังนั้นฉันจึงใช้. cshrc ทุบตีเพื่อเปลี่ยนของฉัน เชลล์และ ssh จะไม่ทำงานอีกต่อไป)
lsd

ดีที่น่าสนใจอย่างแน่นอน ฉันสงสัยว่าฉันจะวินิจฉัยสิ่งนี้ได้อย่างไรเนื่องจากการดำเนินการคำสั่ง rsync แสดงให้เห็นว่าไม่มีสิ่งใดสะท้อนไปที่หน้าจอและการลงชื่อเข้าใช้ยังคงเงียบสนิท? อืม ... ฉันสงสัยว่ามีบางอย่างผิดปกติกับเปลือกหอยตามที่คุณแนะนำหรือไม่ ขอบคุณ
rfreytag

1

ซึ่งอาจเกิดจากข้อความเข้าสู่ระบบบนโฮสต์ระยะไกลเช่น "รหัสผ่านของคุณกำลังจะหมดอายุใน 6 วัน" ซึ่ง RSYNC ไม่ได้คาดหวัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.