दूरस्थ एसएसएच कमांड - बैश बाइंड चेतावनी: लाइन संपादन सक्षम नहीं


17

मैं bash 4.3.11 (1) का उपयोग कर रहा हूं और निम्नलिखित इतिहास प्लगइन स्थापित किया है (के माध्यम से .bash_it )।

# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'

जब मैं एक संवादात्मक सत्र में प्रवेश करता हूं तो सब ठीक है लेकिन जब मैं ssh host 'ls -als'उदाहरण के लिए दूरस्थ कमांड चलाता हूं, तो मुझे निम्न आउटपुट दिखाई देता है:

: ssh host 'ls -als'
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 3: bind: warning: line editing not enabled
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 4: bind: warning: line editing not enabled

जब मैं echo -e '\0033\0143'प्रत्येक बाइंड कॉल के बाद इतिहास प्लगइन को संशोधित करता हूं तो मुझे चेतावनी नहीं मिलती है, लेकिन मेरा कंसोल साफ़ हो जाता है। एक बड़ी कमी नहीं है, लेकिन रिमोट कमांड के लिए इसे दबाने के लिए एक क्लीनर तरीका जानना अच्छा होगा।

# Works, but annoyingly clears console
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
echo -e '\0033\0143'
bind '"^[[B":history-search-forward'
echo -e '\0033\0143'

जवाबों:


28
ssh host 'ls -als'

जब आप ssh को दूरस्थ सिस्टम पर कमांड चलाने के लिए कहते हैं, तो ssh सामान्य रूप से दूरस्थ सत्र के लिए PTY (छद्म-TTY) आवंटित नहीं करता है। आप -tइसे tty आवंटित करने के लिए बाध्य करने के लिए ssh चला सकते हैं :

ssh -t host 'ls -als'

यदि आप हर समय टाइप नहीं करना चाहते हैं, तो आप अपने स्थानीय होस्ट पर ".ssh / config" फाइल में इस लाइन को जोड़ सकते हैं:

RequestTTY yes

वैकल्पिक रूप से, आप चल रहे आदेशों से बचने के लिए अपने दूरस्थ सिस्टम पर ".bashrc" फ़ाइल को ठीक कर सकते हैं, मान लें कि जब यह नहीं है तो सत्र इंटरैक्टिव है। एक तरीका यह है कि सत्र को TTY में एक परीक्षण में आदेशों को शामिल किया जाए:

if [ -t 1 ]
then
    # standard output is a tty
    # do interactive initialization
fi

1
वास्तव में यह उत्तर गलत है, नीचे @ अलेक्जेंडर-वोरोबिव का उत्तर देखें।
अहमद मसूद

2

काम करने के लिए एक इंटरैक्टिव सत्र होना पर्याप्त नहीं है bind। उदाहरण के लिए एमएसीएस शेल एक संवादात्मक सत्र प्रदान करता है जो if [ -t 1 ]परीक्षण पास करता है लेकिन इसमें लाइन एडिटिंग नहीं है इसलिए bindआपके किसी भी एस ~/.bashrcचेतावनी उत्पन्न करेगा। इसके बजाय, आप जाँच सकते हैं कि क्या लाइन एडिटिंग कुछ इस तरह से सक्षम है (क्या कोई सरल / बेहतर तरीका है?)?

if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
  echo "line editing is on"
fi

इसका सही उत्तर होना चाहिए
अहमद मसूद

1
इसका आसान तरीका होगा[[ ${SHELLOPTS} =~ (vi|emacs) ]] && echo 'line-editing on' || echo 'line-editing off'
अहमद मसूद

1

बाइंड कमांड को एक 'if' स्टेटमेंट में रखें, जो चेक करता है कि bash सेशन लाइन एडिटिंग की अनुमति देता है:

if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then
    bind '"^[[A":history-search-backward'
    bind '"^[[B":history-search-forward'
fi

1

यदि कोई पंक्ति संपादन नहीं है, तो ये bindआदेश स्वयं हानिरहित हैं। चेतावनी को दबाएं:

bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward'  2>/dev/null

यह कुछ हद तक असभ्य है, फिर भी इसे काम करना चाहिए। अन्य उत्तर सर्वोत्तम / पर्याप्त परीक्षण के बारे में सहमत नहीं हैं। मेरा दृष्टिकोण इस पर ध्यान देता है। हालांकि यह अच्छी तरह से पैमाने पर नहीं है। अकेले दो आदेशों को बड़ा अंतर नहीं करना चाहिए; लेकिन अगर आपके पास दर्जनों की तरह अधिक था, तो एक उचित सशर्त शायद बेहतर होगा।


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