Sftp को तोड़ने के बिना .bashrc का उपयोग करें


20

मेरी समस्या यह है कि मुझे कुछ चरों को सेट करने की आवश्यकता है, और हर बार जब मैं ssh शेल में लॉगिन करता हूं, तो कुछ पंक्तियों को आउटपुट करता हूं, और साथ ही मुझे फाइलज़िला के माध्यम से फ़ाइलों को टार्ंसफर करने के लिए sftp का उपयोग करने में सक्षम होना चाहिए।

अब, http://www.openssh.org/faq.html पर खुलने वाले FAQ के अनुसार , यदि आपकी स्टार्टअप स्क्रिप्ट किसी भी तरह के आउटपुट को प्रतिध्वनित करती है, तो यह sftp के साथ गड़बड़ी करता है। तो यह या तो अनिश्चित काल तक देरी करता है, या "बाहर निकलने वाले कोड 128 के साथ सर्वर द्वारा बंद किए गए कनेक्शन" के साथ त्रुटियां।

मैंने .bash_profile को .bashrc पर ले जाने या इन कोड .bashrc में निम्न कोड का उपयोग करके समाधान की कोशिश की है:

if [ "$TERM" != "dumb" ]
then
   source .bashc_real
fi

तथा:

if [ "$TERM" = "xterm" ]
then
   source .bashc_real
fi

हालांकि, कुछ भी काम नहीं करता है। मेरा शेल टर्मिनल बैश है, और मैं फाइलज़िला के साथ sftp से जुड़ता हूं।

जवाबों:


23

इसके बजाय यह करने की कोशिश करें

if [ "$SSH_TTY" ]
then
   source .bashc_real
fi

17

माइक का जवाब शायद काम करेगा। लेकिन यह इंगित करने के लायक है कि आप इसे सावधानीपूर्वक चुन सकते हैं कि कौन सी स्टार्टअप फ़ाइलों को वर्बोज़ सामान में डाला जाए। बैश मैन से:

जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में या एक गैर-इंटरेक्टिव शेल के रूप में - एल्गिन विकल्प के रूप में लागू किया जाता है, तो यह पहले फ़ाइल / आदि / प्रोफाइल से कमांड को पढ़ता है और निष्पादित करता है, यदि वह फ़ाइल मौजूद है। उस फ़ाइल को पढ़ने के बाद, यह उस क्रम में ~ / .bash_profile, ~ / .bash_login और ~ / .profile की तलाश करता है, और पहले मौजूद से कमांड पढ़ता और कार्यान्वित करता है जो कि पढ़ने योग्य है। जब इस व्यवहार को रोकने के लिए शेल शुरू किया जाता है - तो नोप्रोफाइल विकल्प का उपयोग किया जा सकता है।

जब एक इंटरेक्टिव शेल जो लॉगिन शेल नहीं है, तो bash पढ़ता है और ~ / .bashrc से कमांड निष्पादित करता है, यदि यह फाइल मौजूद है। यह --norc विकल्प के उपयोग से बाधित हो सकता है। --Rcfile फ़ाइल विकल्प ~ / .bashrc के बजाय फ़ाइल से आदेशों को पढ़ने और निष्पादित करने के लिए बैश करने के लिए बाध्य करेगा।

Sftp / scp टूल एक इंटरेक्टिव नॉन-लॉगिन शेल शुरू करते हैं, इसलिए .bashrc को सोर्स किया जाएगा। कई वितरण स्रोत .bashrc से .bash_profile या इसके विपरीत, ताकि यह भ्रमित हो सके। अपने लॉगिन वातावरण की स्वच्छता का परीक्षण करने के लिए एक अच्छी चाल एक कमांड के साथ ssh है, जो उसी तरह scp / sftp कनेक्ट का अनुकरण करता है। उदाहरण के लिए: ssh myhost /bin/trueजब आप कनेक्ट करते हैं तो आपको वही दिखाएगा जो scp / sftp देखता है।

एक साधारण डेमो:

insyte@mazer:~$ echo "echo Hello from .profile" > .profile
insyte@mazer:~$ echo "echo Hello from .bashrc" > .bashrc

sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$

insyte@mazer:~$ rm .bashrc

sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$

पहले परीक्षण के कारण scp / sftp / rsync आदि टूट जाएंगे। दूसरा संस्करण ठीक काम करेगा।


मैं इस बात से सहमत नहीं हूँ कि "Sftp / scp टूल्स एक इंटरेक्टिव नॉन-लॉगिन शेल शुरू करते हैं " क्योंकि हम वास्तव में शेल के साथ इंटरैक्ट नहीं कर सकते हैं । लेकिन मुझे समझ में नहीं आता कि क्यों या के .bashrcलिए स्रोत होगा । scpssh host command
pynexj

2
शब्द "इंटरैक्टिव" व्यक्तिपरक नहीं है। यह अपने स्टार्टअप मोड का वर्णन करने के लिए बैश द्वारा उपयोग किया जाने वाला शब्द है। यह एक तथ्य है कि sftp / scp एक "इंटरएक्टिव नॉन-लॉगिन शेल" शुरू करता है। डेवलपर्स के साथ बहस करने के लिए स्वतंत्र महसूस करें कि क्या सोर्सिंग नहीं है। इस मामले में .ashrc उपयुक्त है; मैं सिर्फ आपको बता रहा हूं कि यह क्या करता है।
Insyte

2
Bashद्वारा लागू scpया ssh host commandवास्तव में गैर-संवादात्मक है । मुझे यह बस बाश मैनुअल में मिला: "बैश यह निर्धारित करने का प्रयास करता है कि यह अपने नेटवर्क इनपुट से जुड़े मानक इनपुट के साथ चलाया जा रहा है या नहीं , जब दूरस्थ शेल डेमॉन द्वारा निष्पादित किया जाता है, आमतौर पर rshd, या सुरक्षित शेल डेमॉन sshd । यदि bash निर्धारित करता है। इसे इस तरीके से चलाया जा रहा है, यह उस कमांड को पढ़ता है और उस पर अमल करता है ~/.bashrc, अगर वह फाइल मौजूद है और पढ़ने योग्य है। " यहाँ दिलचस्प इतिहास है
pynexj

1
इस विकी पृष्ठ में अनुभाग दूरस्थ गैर लॉगिन गैर संवादात्मक गोले भी देखें ।
pynexj

3

यदि आप csh का उपयोग कर रहे हैं:

if ($?prompt)
  ... interactive stuff ...

और अगर यह बैश है:

if [[ $- == *i* ]]; then
  ... interactive stuff ...
fi

या वैकल्पिक रूप से बैश नियमित अभिव्यक्ति का उपयोग करते हुए:

if [[ $- =~ i ]]; then
  ... interactive stuff ...
fi

इन पंक्तियों को उन पंक्तियों से पहले होना चाहिए जहाँ आप कुछ वापस करना चाहते हैं।


नमस्ते, क्या आप कोड समझा सकते हैं, कृपया। मुझे पता है कि $? पिछली कमांड का रिटर्न लेवल है। मैं $ शीघ्र और $ - हालांकि समझ में नहीं आता है। या csh विशिष्ट है?
जोएल जी मैथ्यू

1
@Droidzone: $?varमें cshरिटर्न 1 अगर varपरिभाषित किया गया है और 0 अन्यथा। $-में bashहोता हो iइसके मूल्य में चार यदि खोल इंटरैक्टिव है।
pynexj

$ समझाने के लिए उत्तर का अद्यतन करना चाहिए - शेल विकल्पों का एक विशेष चर है। देखें stackoverflow.com/questions/5163144/…
मणिनवन

1

माइक के समाधान ने मेरे लिए भी काम किया। लेकिन चूंकि मेरा डिफ़ॉल्ट शेल TCSH है, इसलिए मुझे इस प्रकार (.tcshrc) के रूप में फिक्स को थोड़ा संपादित करना पड़ा।

if ( $?SSH_TTY ) then
    exec /bin/bash
endif

बस मैंने सोचा कि मैं सभी के लाभ के लिए साझा करूंगा।


0

मुझे यहां बताए गए कुछ अन्य समाधान बेहतर हैं, लेकिन मुझे लगा कि मैं अपने स्टार्टअप स्क्रिप्ट में इको कमांड के कारण SFTP डिस्कनेक्ट को रोकने के लिए अपने bash और csh VMs पर वर्तमान में उपयोग किए जाने वाले समाधान को फेंक देता हूं, बस किसी को भी जानकारी उपयोगी लगती है ।

BASH में:

if [ $TERM == "xterm" ] || [ $TERM == "xterm-256color" ]; then
  echo "Xterm display identified: echo enabled"
  echo_disable="0"
else
  echo_disable="1"
fi

# Use the following for all subsequent echo commands
if [ $echo_disable == 0 ]; then
 echo "Safe to display on Xterm"
fi

Csh में:

if ($TERM == "xterm") then
  echo "Xterm display identified: echo enabled"
  set echo_disable = "0"
else
  set echo_disable = "1"
endif

# Use the following for all subsequent echo commands
if !( "$echo_disable" ) echo "Safe to display on Xterm"

यह थोड़ा क्रूर बल है, लेकिन यह काम करता है।


मैंने ऊपर ["$ SSH_TTY"] कोड का उपयोग करने की कोशिश की और पाया कि यह केवल पोटीन जैसे सरल ग्राहक कार्यक्रमों के लिए काम करता है। जब मैं NoMachine का उपयोग करता हूं तो यह कोई आउटपुट प्रदान नहीं करता है। यही कारण है कि मुझे उपरोक्त कोड में "xterm-256color" शामिल करने की आवश्यकता थी।
बॉब नूनन

दिलचस्प बात यह है कि, "if ($? SSH_TTY) का उपयोग करते हुए" तब भी मेरे csh VM के लिए काम नहीं किया। मैंने जाँच की और कोई SSH_TTY पर्यावरण चर परिभाषित नहीं है। तो ऊपर दिया गया मेरा कोड उन लोगों के लिए मददगार हो सकता है जिनके पास समान स्थिति है।
बॉब नूनन

0

यहाँ मेरी (डिफ़ॉल्ट) .bashrcफ़ाइल की पहली पंक्तियाँ हैं :

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

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

एक इंटरैक्टिव सत्र के लिए चेक एससीपी, एसएफटीपी या ssh remote-host commandमोड के साथ गड़बड़ करने से बचता है।

इसके बिना, यदि आपकी फ़ाइल .bashrcका उपयोग करता है echoया stdout पर कुछ अन्य सामान की छपाई होती है, तो आपको इस तरह की त्रुटियाँ हो सकती हैं:

  • SFTP: Received message too long 168435779
  • एससीपी: protocol error: unexpected <newline>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.