मेजबानों के लिए पूरा होने वाला टैब ~ / .ssh / config में परिभाषित है जो योसमाइट पर अब काम नहीं करता है


38

मैं ~/.ssh/configसर्वर कनेक्शन पर अपने काम के जीवन को सरल बनाने के लिए अपनी फ़ाइल बनाने की कोशिश कर रहा हूं ।

Mavericks में सभी ने ठीक से काम किया और tabमैं इस तरह फ़ाइल के साथ होस्टनाम को स्वतः पूर्ण करने में सक्षम था:

Host test-host-name
    HostName 192.168.1.2
    User root

योसेमाइट पर समान कॉन्फ़िगरेशन का एक अलग व्यवहार है। जब मैं ssh tशेल पर टाइप करता हूं tabतो होस्टनाम को स्वत: पूर्ण नहीं करता है।

क्या किसी को पता है कि योसेमाइट में कुछ बदल गया है और अब मुझे इसे काम करने के लिए कुछ करने की ज़रूरत है?

जवाबों:


37

आप काढ़ा केbash-completion माध्यम से स्थापित करके बैश शेल को पूरा कर सकते हैं :

brew install bash-completion

फिर अपने को निम्नलिखित जोड़ें ~/.bash_profile:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi

स्रोत

(संपादित करें: brew tap homebrew/completions2018 के रूप में पदावनत किया गया है।)


+1 :) बैश पूरा होने के समय 1.3.3.high_sierra, यह मुझे बताता है कि मुझे जोड़ना चाहिए [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion। क्या आप विस्तृत कर सकते हैं कि किस संस्करण (या आपके) को प्राथमिकता दी जानी चाहिए और क्यों?
जाॅन

15

मुझे लगता है कि आपके मैक का खोल बैश है।

आपको ssh कमांड को पूरा करने की आवश्यकता है, और अधिक विवरण के लिए आप पढ़ सकते हैं man complete

_complete_ssh_hosts ()
{
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        comp_ssh_hosts=`cat ~/.ssh/known_hosts | \
                        cut -f 1 -d ' ' | \
                        sed -e s/,.*//g | \
                        grep -v ^# | \
                        uniq | \
                        grep -v "\[" ;
                cat ~/.ssh/config | \
                        grep "^Host " | \
                        awk '{print $2}'
                `
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

sourceअपने टर्मिनल में लोड करने के लिए नया कमांड प्राप्त करने के लिए आपको फ़ाइल की आवश्यकता नहीं है । या आप इस कोड को .bash_profile में डाल सकते हैं


हां, खोल बैश है। Maveriks में मुझे यह चीजें करने की आवश्यकता क्यों नहीं थी?
RikyTres

नहीं, मैंने अभी-अभी परीक्षण किया है। मैं डिफ़ॉल्ट रूप से Mavericks में ऐसा नहीं कर सकता।
नेल्सन

comp_ssh_hosts=$(awk -F , 'FNR== NR && ! /^#|\[/ {field = $1} FNR != NR && /^Host / {field = $2} {hosts[field]} END {for (host in hosts) {print host}' "$HOME/.ssh/known hosts" "$HOME/.ssh/config")
अगली सूचना तक रोक दिया गया।

2

MacWorld पर इस लेख से ।

निम्नलिखित को कॉपी / पेस्ट करें ~/.bash_profile:

complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh

फिर आपको अपने टर्मिनल या प्रकार को पुनरारंभ करने की आवश्यकता होगी source ~/.bash_profile(ध्यान दें कि उत्तरार्द्ध केवल आपके वर्तमान टैब में काम करेगा)।


मेरे लिए काम नहीं किया। लेकिन Apple.stackexchange.com/a/168168/136365 ने किया। मुझे लगता है कि इस तरह से कुछ के लिए माणिक पर भरोसा करने से बचना सबसे अच्छा है।
बेन क्रेसी

0

FYI करें, मुझे यकीन नहीं है कि सीधे नेल्सन के जवाब का जवाब कैसे दूं क्योंकि मैंने अभी तक इस पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा का निर्माण नहीं किया है, लेकिन मेरी मशीन पर El Capitan चल रहा है, ^Mमेरी कॉन्फ़िग फ़ाइल से सभी होस्ट नामों में जोड़ा जा रहा था । मुझे या तो \rअपने $IFSवेरिएबल में जोड़ना था या \rदूसरे के आउटपुट से सभी इंस्टेंस को हटाना / बदलना था cat। अंत में, मैंने tr '\r' '\n'उस कमांड चेन को इस तरह बनाने के लिए जोड़कर उत्तरार्द्ध किया :

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'

-1

आप / etc / मेजबान में प्रविष्टियाँ जोड़ सकते हैं और उन्हें मेजबान नाम में स्वत: पूर्ण का उपयोग कर सकते हैं:

"ssh @" + [TAB]

इस फ़ाइल को पुनः लोड करने के लिए सिस्टम के लिए रिबूट आवश्यक है।

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