SSH और SCP के लिए स्वतः पूर्ण सर्वर नाम


61

मेरे पास कुछ सर्वर हैं ~/.ssh/config, जैसे कि alphaऔर beta। मैं बैश को कैसे कॉन्फ़िगर कर सकता हूं जैसे कि कमांड ssh al<tab>और scp file.tgz al<tab>कॉन्फ़िगर किए गए सर्वर के नाम को स्वत: पूर्ण करता है?

जब भी हम सर्वर जोड़ते हैं और नियमित रूप से हटाते हैं और सूची काफी बड़ी होती है, तो मैं हर बार सर्वर को किसी अन्य फ़ाइल (यानी बाश सरणी) में जोड़ना नहीं चाहता ।


2
क्या आपके पास अपने डिस्ट्रो के लिए बैश-पूर्णता पैकेज स्थापित है? मुझे लगता है कि यह मानक पूरा करने वाली दिनचर्या का हिस्सा है, हालांकि मैं इसे zsh के साथ भ्रमित कर सकता हूं।
कालेब

मेरी स्थापना बिल्कुल यही करती है।
स्लम

यह कुबंटु 12.10 पर है, और मैंने bash-completionस्थापित किया है।
dotancohen

जवाबों:


64

मिल गया!!

ऐसा लगता है कि उबंटू में प्रविष्टियां ~/.ssh/known_hostsहैशेड में हैं , इसलिए एसएसएच पूर्णता उन्हें नहीं पढ़ सकती है। यह एक सुविधा है, बग नहीं है। यहां तक कि जोड़कर HashKnownHosts noकरने के लिए ~/.ssh/configऔर /etc/ssh/ssh_configमैं मेजबान हैशिंग को रोकने में असमर्थ था।

हालाँकि, जिन मेज़बानों में मेरी दिलचस्पी है, वे भी इसमें पाए जाते हैं ~/.ssh/config। यहां बैश कम्पलीशन की एक स्क्रिप्ट दी गई है, जो उस फाइल की प्रविष्टियों को पढ़ती है:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

उस स्क्रिप्ट को अंदर रखें /etc/bash_completion.d/sshऔर फिर उसे निम्न कमांड के साथ स्रोत करें:

$ . /etc/bash_completion.d/ssh

मुझे यह मार्गदर्शिका अमूल्य लगी और मैं इसके बिना इसे स्क्रिप्ट में शामिल नहीं कर पाया । उस भयानक गाइड को लिखने के लिए स्टीव केम्प धन्यवाद !


1
ऐसा लगता है कि Centos में 6 प्रविष्टियाँ ~ / .ssh / ज्ञात_होस्ट में ओवर-राइड प्रविष्टियाँ ~ / .ssh / config उदा। अगर आपके पास ज्ञात_होस्ट में foo.bar.baz.com है तो यह पूरी बात से मेल खाएगा यदि आप "ssh foo" <टैब> करते हैं - यह अवांछनीय है यदि आपके पास एक अलग उपयोगकर्ता या अन्य सेटिंग्स है जिसे आप ssfg से लागू करना चाहते हैं। यदि आपके पास ssh config में एक प्रविष्टि है जो ठीक से स्वत: पूर्ण नहीं होती है, तो यह जांचें कि क्या वह know_hosts में मौजूद है और उसे हटा दें। इसे अब विन्यास से सामान्य लेते हुए काम करना चाहिए।
इमरान-यूके

@ इमरान-यूके: यह ज्ञात है कि सुरक्षा के ढोंग के तहत उबंटू उस समझदार काम को नहीं करता है। जाहिरा तौर पर सोचा गया है कि एक दुर्भावनापूर्ण संस्था, निर्देशिका पर chmod 0600 के बावजूद, उपयोगकर्ता ~ ~ .ssh / config संपादित कर सकता है। अरे, मैं निर्णय लेने वाला नहीं था!
डॉटनचेन

1
मैं zsh & oh-my-zsh का उपयोग करता हूं, मैंने अभी पता लगाया है कि "ssh" प्लगइन को सक्षम करने और "HashKnownHosts Yes" को मेरे ~ / .ssh / config में डालने से सही काम होता है। आप शेल को बदल सकते हैं जो भी डिस्ट्रो है तो यह उसके आस-पास का रास्ता हो सकता है।
इमरान-यूके

@ इमरान-यूके: वास्तव में मैंने अतीत में zsh की कोशिश की है और मैं इसे फिर से आजमाने का इरादा रखता हूं। मैं उस पर गौर करूंगा। शुकराना मेरे दोस्त!
डॉटान्चेन

मुझे पता है कि मुझे पार्टी में थोड़ी देर हो गई है, लेकिन आरएचईएल 7 स्वतः पूर्ण प्रविष्टियां करेगा जो /etc/hostsअन्य डिस्ट्रोस भी कर सकते हैं।
सेंटिमेन

16

पहले से पैक

आप यह नहीं कहते कि आप किस डिस्ट्रो का उपयोग कर रहे हैं, लेकिन मेरे फेडोरा 19 सिस्टम पर मेरे पास निम्न पैकेज स्थापित है, bash-completionजो इस पूर्ण नियम फ़ाइल के माध्यम से यह सुविधा प्रदान करता है:

/usr/share/bash-completion/completions/ssh

यहां मैंने जो पैकेज स्थापित किया है:

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

यदि आप उस नियम फ़ाइल के माध्यम से देखते हैं, तो आप फ़ाइल के साथ पूछताछ करने वाले stanzas देखेंगे $HOME/.ssh/config:

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

अपना खुद का रोल करना

मुझे यह Gist भी ज्ञात है, जिसे_हॉट्स_ऑटोकॉम्पटेड .sh है , जो $HOME/.ssh/known_hostsफ़ाइल के अलावा कुछ ऐसा ही करता है ।

# add to ~/.bash_profile, and close/reopen a shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

आप अपनी $HOME/.ssh/configफ़ाइल का उपयोग करके कुछ ऐसा कर सकते हैं यदि किसी कारण से आप sshपहले से पैक किए गए पूर्ण नियम फ़ाइल को खोजने में असमर्थ हैं ।


धन्यवाद। ऐसा लगता है कि Ubuntu के साथ जहाज नहीं है /usr/share/bash-completion/completions/ssh। क्या आप उस पूरी फ़ाइल को कहीं पोस्ट कर सकते हैं जिसे मैं कॉपी कर सकता हूं? धन्यवाद!
dotancohen

: आप इस संग्रह से सभी फाइलों को प्राप्त कर सकते हैं pkgs.fedoraproject.org/repo/pkgs/bash-completion/...
SLM

मैं एक दर्द होने के लिए माफी चाहता हूँ, लेकिन /usr/share/bash-completion/completions/sshमदद करने के लिए उस टार संग्रह से ssh फ़ाइल की नकल भी नहीं करता! न तो complete -W ...बैश प्रॉम्प्ट से कमांड चला रहा है । यहां क्या मुद्दा हो सकता है?
dotancohen

धन्यवाद। यह उबंटू में एक ज्ञात डिजाइन निर्णय प्रतीत होता है । इस प्रकार मैं जवाब को स्वीकार कर रहा हूं, भले ही मुझे बैश पूरा होने के लिए sshया काम करने का मौका न मिले scp
डॉटनकोहेन

2
OSX के लिए Homebrew में यह भी है: बैश-पूर्णता और zsh- पूर्णता
एडम नेल्सन

7

मैंने पाया कि स्वतः पूर्ण काम नहीं कर रहा था क्योंकि उबंटू मेजबान को पहचानता है। आप जोड़ सकते हो

Host *
    HashKnownHosts no

आपकी .ssh/configफ़ाइल पर मौजूदा होस्ट अन-हैश नहीं होंगे।


धन्यवाद। मैंने वास्तव में इस निर्देश को पहले ही जोड़ ~/.ssh/configदिया है और निर्देश को बदल दिया है /etc/ssh/ssh_config, और मैंने ~/.ssh/known_hostsफ़ाइल को हटा दिया है । फिर से सर्वर में लॉग इन करने के बाद, होस्ट नाम अभी भी हैशेड से बचाए जा रहे हैं।
डॉटनकॉहेन

मैंने अपना उत्तर संपादित कर लिया है; आपको एक होस्ट निर्दिष्ट करना होगा और अंदर हैश निर्देश को घोंसला बनाना होगा; मैंने यह सूची नहीं दी है कि .ssh/configपहले से ही कई फाइलों में यह रेखा होगी। मुझे बताएं कि क्या वह काम करता है।
M1ke

यह निश्चित रूप से इसे करने का आसान तरीका है! यह देखते हुए कि (उबंटू के नए संस्करण) में अब पूरा होने योग्य है, यह शायद वही है जो चाहता था।
जॉन मोंटगोमरी

जैसा कि मैंने नीचे जोड़ा है, आप ऐसा कर सकते हैं, लेकिन आपको शायद ऐसा नहीं करना चाहिए - वैसे भी काम पूरा करने के लिए आपको ज़रूरत नहीं है। हालाँकि, यदि आप सहमत नहीं हैं और केवल उपरोक्त जोड़ने के बाद मौजूदा मेजबानों को अन-हैश करना चाहते हैं, तो आप बस rm / / .ssh / ज्ञात_होस्ट को rm कर सकते हैं, और जब भी यह फिर से उत्पन्न (अन-हैश) होगा। आप एक नए सर्वर में लॉग इन करें।
जैमिसन बेकर

3

डेबियन और उबंटू में ssh स्वतः पूर्णता को सक्षम करने के लिए:

sudo apt-get install bash-completion

ध्यान दें कि यह ज्ञात_होस्ट्स हैशिंग के साथ करने के लिए कुछ भी नहीं है , इसके विपरीत जो ऊपर कहा गया था और मूल प्रश्न। यदि आप ज्ञात_होस्ट से स्वत: पूर्ण होना चाहते हैं, तो बेशक आपको हैशिंग को अक्षम करना होगा, लेकिन इसके खिलाफ दृढ़ता से अनुशंसा की जाती है।

उदाहरण के लिए, मेरे पास:

Host *
    HashKnownHosts yes

मेरे .ssh / config में, और मेरे पास अभी भी ssh स्वतः पूर्ण है, जो कि .ssh / config और / etc / मेजबान में सूचीबद्ध मेजबानों के खिलाफ ठीक काम कर रहा है। जैसा कि ओपी ने कहा है कि आपको मेजबान को .ssh / config में जोड़ना होगा:

मेरे भयानक-होस्ट को होस्टनाम। The.real.host.name होस्ट करें

(या, आप / etc / मेजबान के लिए एक मेजबान प्रविष्टि जोड़ सकते हैं, जो डेबियन / उबंटू स्क्रिप्ट के लिए एक और स्रोत है।)

फिर, आप बस टाइप कर सकते हैं ssh my-awe<tab>और यह स्वचालित रूप से पूरा हो जाएगा। फिर, यह तब भी है जब आप HashKnownHosts, जो अत्यधिक अनुशंसित है। (ध्यान दें कि बैश समापन को आपके बैश शेल में सक्षम करने की आवश्यकता है, और आपको विशेष रूप से उन स्क्रिप्ट को अपने वितरण के लिए ऊपर स्थापित करने की आवश्यकता है।)

फिर, .bashrcइसे सक्षम करने के लिए इन पंक्तियों को जोड़ें (लॉगआउट की आवश्यकता होती है और bashनया शेल लॉन्च करने के लिए लॉग इन करें या बस एक नया टाइप करना होगा। (यदि यह पहले से ही /etc/bash.bashrcऔर /etc/profileस्रोतों में सक्षम है तो आपको सक्षम करने की आवश्यकता नहीं है /etc/bash.bashrc)।

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

यह ssh स्वतः पूर्ण (अन्य बातों के अलावा!) सक्षम हो जाएगा से ~/.ssh/config, /etc/hostsआदि

ध्यान दें कि डेबियन बैश के बजाय राख को धोता है। आप आसानी से बैश में जा सकते हैं:

sudo usermod -s /bin/bash "$USER"

(प्रभावी होने के लिए आपको लॉग आउट करना होगा और वापस लॉग इन करना होगा।)


2

Ubuntu 14.04 पर, sshआपके द्वारा उल्लिखित ऑटो-सर्वरों को पूरा करता है~/.ssh/config

मैंने इसे देखा जब मुझे एहसास हुआ कि सर्वरों में से केवल एक ही मैं आमतौर पर ऑटो-पूरा करता हूं। दोनों के बीच एकमात्र अंतर ssh config फाइल में एक प्रविष्टि थी जो प्रमाणीकरण से संबंधित थी। जब मैंने दूसरे सर्वर के लिए कॉन्फ़िग फ़ाइल में एक नई प्रविष्टि जोड़ी, तो इसने स्वतः पूर्णता भी शुरू कर दी।

यहां उन लोगों के लिए प्रविष्टि है जो पूछ रहे थे:

HOST server-name 
    GSSAPIAuthentication=no

मुझे बहुत आश्चर्य होगा अगर इससे कोई फर्क पड़ता है कि आप कॉन्फ़िगर में क्या निर्दिष्ट कर रहे थे (जब तक यह अभी भी मान्य है, निश्चित रूप से)।


धन्यवाद, नूह, वह प्रविष्टि क्या थी? मेरे 14.04 और 14.10 सिस्टम पर स्वतः पूर्ण काम नहीं करता है।
19anc में डॉटंचोहेन

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