ดูเหมือนว่า Rsync เข้ากันไม่ได้กับ. bashrc (สาเหตุ“ เปลือกของคุณสะอาดหรือไม่”)


16

ปรากฎว่า rsync ไม่สามารถทำงานกับเซิร์ฟเวอร์ระยะไกลที่มีไฟล์. bashrc ได้หรือไม่

ที่ลูกค้าในพื้นที่ฉันได้รับเมื่อใช้ rsync:

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]

ตามที่แนะนำในที่นี้การลบ. bashrc บนเซิร์ฟเวอร์แก้ไขปัญหาได้ วิธีแก้ปัญหาโดยไม่ลบไฟล์. bashrc (ชั่วคราว)?


1
ตรวจสอบว่าเปิดใช้งาน ssh สำหรับบัญชีนั้นหรือไม่
Lamy

คำตอบด้านล่างอาจไม่ถูกต้อง ฉันเพิ่งเริ่มรับข้อผิดพลาดนี้หลังจากอัปเดต Ubuntu เป็นประจำแม้ว่าจะไม่มีอะไรเปลี่ยนแปลงในไฟล์. bashrc ของฉัน
Cerin

ไม่ใช่ - หากการลบไฟล์. bashrc แก้ไขได้ (ตามที่ระบุไว้ในคำถามนี้) แสดงว่าปัญหาคือผลลัพธ์จาก. bashrc การอัพเกรดสามารถแนะนำความเข้ากันได้ของโปรโตคอลจริงซึ่งเป็นปัญหาที่แตกต่างอย่างสิ้นเชิง
Randall

คำตอบ:


21

คุณสามารถพบปัญหาหาก.bashrcเซิร์ฟเวอร์ระยะไกลส่งสัญญาณอะไรไปยังเทอร์มินัล Rsync อาจไม่คาดหวังสิ่งนั้นและอาจมีปัญหาตามมา

คุณสามารถแก้ไขได้โดยลบคำสั่งใด ๆ ใน.bashrcข้อความเอาต์พุตหรือโดยไพพ์เอาต์พุตใด ๆ ไปยัง / dev / null


3
ดังนั้นวิธีการไพพ์เอาต์พุตใด ๆ ไปยัง / dev / null ถ้าฉันสามารถแก้ไขไฟล์บนไคลเอ็นต์ได้เท่านั้น?
คำนวณ

1
ฉันคิดว่าคุณสามารถเป็นผู้ดูแลระบบของคุณเพื่อขอความช่วยเหลือ คุณอาจสามารถแก้ไขไฟล์บนเซิร์ฟเวอร์ในอีกทางหนึ่งเช่น FTP หรือ scp
เกร็กฮิวกิล

ใช่ไฟล์. bashrc ของฉันมี echo "*** เริ่มต้นรูทเชลล์ ***" และ echo "(โปรดใช้ sudo แทนรูทเชลล์ทุกครั้งที่ทำได้!)" การลบเสียงสะท้อนเหล่านั้นช่วยแก้ไขปัญหาได้
Kentgrav

1
จากหน้า rsync: "เวอร์ชั่นของโปรโตคอลไม่ตรงกัน - เปลือกของคุณสะอาดหรือไม่" ข้อความนี้มักจะเกิดจากสคริปต์เริ่มต้นของคุณหรือตัวช่วยสร้างเชลล์ระยะไกลสร้างขยะที่ไม่พึงประสงค์บนสตรีมที่ rsync ใช้สำหรับการส่งผ่าน วิธีการวินิจฉัยปัญหานี้คือการเรียกใช้เชลล์ระยะไกลของคุณเช่นนี้: ssh remotehost / bin / true> out.dat จากนั้นดูที่ไฟล์ out.dat หากทุกอย่างทำงานอย่างถูกต้อง out.dat ควรเป็นไฟล์ความยาวเป็นศูนย์
Kentgrav

8

.bashrc ไม่ใช่ตำแหน่งที่ถูกต้องสำหรับสร้างเอาต์พุตเนื่องจากเป็นสาเหตุของปัญหาประเภทนี้ ผู้คนจำนวนมากหนีไปกับมันจนกว่าพวกเขาจะพยายามเรียกใช้ rsync :-)

ผลลัพธ์ที่ต้องการ (และตรรกะและคำสั่งที่เกี่ยวข้อง) ควรถูกย้ายไปยัง. bash_profile ของคุณ (ดูเช่นคำถามข้อบกพร่องของเซิร์ฟเวอร์ ".profile vs. .bash_profile vs. .bashrc"สำหรับการสนทนาเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างไฟล์)

ด้วยวิธีนี้คุณไม่จำเป็นต้องเสียสละรับเอาต์พุตเมื่อคุณเข้าสู่ระบบหรือจัดการกับการเปลี่ยนแปลงชั่วคราวกับ. bashrc ของคุณเมื่อคุณต้องการใช้ rsync


6

ฉันเคยมีไฟล์. bashrc ในบัญชีผู้ใช้ของฉันและไม่เคยมีปัญหานี้มาก่อนจนกระทั่งวันนี้ฉันพยายามซิงค์บางสิ่งไปยังเซิร์ฟเวอร์ของฉันโดยใช้บัญชีรูท โพสต์ของคุณช่วยฉันหาวิธีแก้ปัญหา:

ไฟล์ $ user / .bashrc ของฉันเริ่มต้นด้วยส่วนต่อไปนี้เสมอเพื่อป้องกันปัญหาประเภทนี้ ฉันทำซ้ำมันเพื่อ. bashrc และ rsync'ing ของ root ตอนนี้ทำงานเหมือนมีเสน่ห์!

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

HTH, Karsten


สิ่งนี้มักจะใช้ไม่ได้rsyncเพราะเป็นเหตุผลอะไรก็ตามที่จัดเป็น "เชลล์เชิงโต้ตอบ" แต่มันก็เป็นบรรทัดที่ดีในการเพิ่มเพราะมันอาจทำให้กระสุนที่ไม่มีการโต้ตอบเป็นอย่างอื่นได้หากมีเอาต์พุตใด ๆ
Michael Schubert

ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดสำหรับคำถาม คำตอบที่ยอมรับ "ลบคำสั่งใด ๆ ใน. bashrc ที่ข้อความเอาต์พุต" ไม่สามารถใช้งานได้จริง
Qinsi

4

สำหรับเหตุผลที่ซับซ้อน rsync / scp / sftp ทำงาน. bashrc เมื่อเชื่อมต่อกับโฮสต์อื่น คุณต้องมีคำสั่งใด ๆ เหล่านี้ที่ด้านบนของ. bashrc ของคุณ :

ทั้ง

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

หรือ

[ -z "$PS1" ] && return

คำสั่งใด ๆ ข้างต้นจะอนุญาตให้เรียกใช้งานคำสั่ง. bashrc ที่เหลือสำหรับเซสชันแบบโต้ตอบเท่านั้นเท่านั้น เท่าที่ฉันรู้ว่าคุณไม่ต้องการใช้เซสชันประเภทอื่น (และแน่นอนฉันเห็น bashrc เริ่มต้นจาก Arch และ Debian โดยใช้เทคนิคนี้ใน bashrc ของพวกเขา)

อย่างไรก็ตามหากคุณต้องการให้มีความหวาดระแวงเป็นพิเศษเกี่ยวกับการให้คำสั่ง bashrc ของคุณทำงานแม้ในเซสชันที่ไม่มีการโต้ตอบคุณควรห่อคำสั่งของ bashrc ของคุณอย่างน้อยที่สุดซึ่งจะสร้างเอาต์พุตเช่นนี้ ( อ้างอิง )

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

โปรดทราบว่าคนอื่น ๆ แนะนำให้ย้ายคำสั่งที่ส่งข้อความไปยัง bash_profile ของคุณ แต่ฉันมีข้อสงสัยเกี่ยวกับว่าสิ่งนี้ดีเสมอ ( ด้วยเหตุผลอธิบายที่นี่ )

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