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 उस खाते के लिए सक्षम है।
लैमी

नीचे दिए गए उत्तर गलत हैं। मैं हाल ही में एक नियमित Ubuntu नवीनीकरण के बाद यह त्रुटि प्राप्त करना शुरू कर दिया, भले ही मेरी .bashrc फ़ाइलों में कुछ भी नहीं बदला।
सेरिन

नहीं - यदि .bashrc फ़ाइल को निकालने से यह ठीक हो जाता है (जैसा कि इस प्रश्न में कहा गया था), तो समस्या .bashrc से आउटपुट है। एक उन्नयन निश्चित रूप से एक वास्तविक प्रोटोकॉल असंगति को पेश कर सकता है, जो एक पूरी तरह से अलग मुद्दा है।
रान्डेल

जवाबों:


21

आप समस्याओं में चला सकते हैं यदि .bashrcरिमोट सर्वर टर्मिनल पर कुछ भी आउटपुट करता है। Rsync उम्मीद नहीं कर सकता है और इसके परिणामस्वरूप समस्याएं हो सकती हैं।

आप इसे .bashrcउस आउटपुट टेक्स्ट के किसी भी कमांड को हटाकर , या आउटपुट को / dev / null में डालकर ठीक कर सकते हैं ।


3
तो किसी भी आउटपुट को / dev / null में कैसे पाइप करें यदि मैं केवल क्लाइंट पर फ़ाइलों को संशोधित कर सकता हूं?
15

1
मुझे लगता है कि आप सहायता के लिए आपके सिस्टम प्रशासक के रूप में हो सकते हैं। आप किसी अन्य तरीके से सर्वर पर फ़ाइलों को संशोधित करने में भी सक्षम हो सकते हैं, जैसे कि एफ़टीपी या एससीपी।
ग्रेग हेविगिल

हाँ मेरी .bashrc फ़ाइल में एक गूंज थी "*** स्टार्टिंग रूट शेल ***" और गूंज "(कृपया जब भी संभव हो एक रूट शेल के बजाय सुडो का उपयोग करें!)"। उन इको को हटाकर समस्या को ठीक किया।
केंटग्राव

1
Rsync मैन पेज से: "प्रोटोकॉल संस्करण बेमेल - क्या आपका शेल साफ है?" यह संदेश आम तौर पर आपके स्टार्टअप स्क्रिप्ट या रिमोट शेल सुविधा के कारण होता है, जो कि rsync अपने परिवहन के लिए उपयोग कर रहा है। इस समस्या का निदान करने का तरीका आपके दूरस्थ शेल को इस तरह चलाना है: ssh Remotehost / bin / true> out.dat फिर out.dat फ़ाइल को देखें। यदि सब कुछ सही ढंग से काम कर रहा है तो out.dat एक शून्य लंबाई फ़ाइल होनी चाहिए।
कैंटग्राव

8

.Bashrc वास्तव में आउटपुट उत्पन्न करने के लिए सही जगह नहीं है, क्योंकि यह इस तरह की समस्या का कारण बनता है। बहुत सारे लोग इसके साथ दूर हो जाते हैं, हालांकि, जब तक वे rsync चलाने की कोशिश नहीं करते हैं :-)

किसी भी वांछित आउटपुट (और संबंधित लॉजिक और कमांड) को आपके .bash_profile (देखें, उदाहरण के लिए, सर्वर पर हमला प्रश्न ".profile बनाम .bash_profile बनाम .bashrc" के बीच फ़ाइलों के बीच अंतर पर चर्चा के लिए ) ले जाया जाना चाहिए ।

इस प्रकार, आपको लॉगिन करते समय आउटपुट प्राप्त करने के लिए बलिदान करने की आवश्यकता नहीं होगी, न ही अपने .bashrc में अस्थायी परिवर्तन करने से निपटने के लिए जब आप rsync का उपयोग करना चाहते हैं।


6

मेरे पास हमेशा अपने उपयोगकर्ता खातों पर .bashrc फाइलें होती हैं और कभी भी यह समस्या नहीं होती है जब तक कि मैंने रूट खाते का उपयोग करके अपने सर्वर से कुछ को rsync करने की कोशिश नहीं की। आपकी पोस्ट ने मुझे समाधान खोजने में मदद की:

इस तरह की समस्या को रोकने के लिए मेरी $ उपयोगकर्ता / .bashrc फाइलें हमेशा निम्न अनुभाग से शुरू होती हैं। मैंने इसे रूट के .bashrc और rsync'ing के लिए दोहराया, जो अब एक आकर्षण की तरह काम करता है!

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

HTH, कर्स्टन


यह आमतौर पर काम नहीं करता है rsync, क्योंकि यह "इंटरेक्टिव शेल" के रूप में वर्गीकृत किसी भी कारण से है। लेकिन यह किसी भी तरह से जोड़ने के लिए एक अच्छी लाइन है, क्योंकि अगर कोई आउटपुट है तो यह गैर-इंटरैक्टिव गोले को खराब कर सकता है।
माइकल शुबर्ट

मुझे लगता है कि यह सवाल का सबसे अच्छा समाधान है। स्वीकार जवाब ".bashrc कि आउटपुट पाठ में किसी भी कमांड को हटाने" व्यावहारिक नहीं है।
Qinsi

4

के लिए जटिल कारणों rsync / SCP / SFTP रन .bashrc जब एक और होस्ट से कनेक्ट करते। आपको अपने .bashrc के शीर्ष पर इनमें से कोई भी आदेश होना चाहिए :

भी

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

या

[ -z "$PS1" ] && return

उपरोक्त आदेशों में से कोई भी केवल इंटरैक्टिव सत्र के लिए शेष .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 पर ले जाएं, लेकिन मुझे इस बारे में मेरी शंका है कि क्या यह हमेशा अच्छा है (उदाहरण के लिए समझाया गया है )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.