Zsh पर ssh के लिए कमांड कमांड कैसे संपादित करें?


11

मैं टाइप करने के बाद होस्ट नाम प्रदर्शित करने के लिए zsh पर कमांड कमांडिंग पूरा करना चाहता हूं

ssh [TAB]

मेरे .ssh / config फ़ाइल (और अधिमानतः ज्ञात_होस्ट और / etc / मेजबानों से और कहीं और जो समझ में आता है) से नाम लेना और एक एकल सूची प्रस्तुत करना।

यह वर्तमान में कुछ ऐसा करता है, लेकिन

  1. यह .ssh / config का उपयोग बिल्कुल नहीं करता है
  2. इसके लिए पहले उपयोगकर्ता नाम की आवश्यकता होती है, भले ही .ssh / config का उपयोग करना उपयोगकर्ता नाम लिखना अनावश्यक बनाता है
  3. यह कई सूचियाँ प्रस्तुत करता है (शायद एक ज्ञात_होस्ट से और दूसरा / / / होस्ट से, लेकिन मैंने इसे सत्यापित नहीं किया है)

इसलिए मैं ssh (TAB) टाइप करने के बाद ज्ञात उपयोगकर्ता नाम के साथ-साथ (अधिमानतः एकल) ज्ञात होस्टनाम में शामिल होना चाहता हूं।

(मैं Google से पहले यहां आ रहा हूं क्योंकि 1) इसका परिणाम यहां संग्रहित होने में होगा, और 2) यह संभवतः अधिक कुशल है। यदि कोई और जवाब नहीं देता है, तो मैं जवाब का शिकार करूंगा।)


यह सुपरयूज़र के लिए एक सवाल होगा, मुझे लगता है
एटिने पेरोट

दरअसल, अब इसे देखते हुए मुझे इसे unix.stackexchange.com पर पूछना चाहिए था। (लेकिन मुझे याद नहीं है कि अगर यह 2 साल पहले था जब मैंने इसे पूछा था।) कोई भी इसे स्थानांतरित करना चाहता है?
iconoclast

जवाबों:


16

यहाँ मेरे से प्रासंगिक हिस्सा है .zshrc। यह 2002 के बाद से नहीं बदला है, इसलिए मैं इसे आज अलग तरह से लिख सकता हूं, लेकिन यह अभी भी मेजबान नामों को पूरा करने के लिए काम करता है ~/.ssh/configऔर ~/.ssh/known_hosts(यदि HashKnownHostsयह बंद है - यह उन दिनों में मौजूद नहीं था)।

h=()
if [[ -r ~/.ssh/config ]]; then
  h=($h ${${${(@M)${(f)"$(cat ~/.ssh/config)"}:#Host *}#Host }:#*[*?]*})
fi
if [[ -r ~/.ssh/known_hosts ]]; then
  h=($h ${${${(f)"$(cat ~/.ssh/known_hosts{,2} || true)"}%%\ *}%%,*}) 2>/dev/null
fi
if [[ $#h -gt 0 ]]; then
  zstyle ':completion:*:ssh:*' hosts $h
  zstyle ':completion:*:slogin:*' hosts $h
fi

ठीक है, मैं अंत में समझ गया कि यह काम क्यों नहीं कर रहा है। समस्या आपके द्वारा प्रदान किए गए कोड के साथ नहीं थी: यह ठीक काम करता है, एक बार दूसरी समस्या हल हो गई थी।
आइकनोकॉस्ट

1

sshपूर्णता प्रदान करने वाला कार्य /usr/share/zsh/functions/Completion/Unix/_sshमेरे सिस्टम पर स्थित है।

man zshcompsysप्रलेखन के लिए भी देखें (विशेष रूप से "होस्ट" पर एक खोज करें जो कई स्थानों पर दिखाई देता है और "एसश" जो कुछ स्थानों पर दिखाई देता है)।

यह संभव हो सकता है कि zstyleअपने कमांड को जोड़ने से वह पूरा हो जाए ~/.zshrcजो आप पूरा करने के लिए देख रहे हैं।


या /usr/share/zsh/4.3.9/functions/_sshमैक ओएस एक्स में (संस्करण को अनुकूलित करें)
स्टडर

मैं उस फ़ाइल को स्रोत करता हूं, और ssh <TAB> टाइप करता हूं और मुझे फ़ाइल नाम पूरा हो जाता है। उस के साथ क्या हो रहा है?
आइकनोकॉस्ट

1

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

function complete_host_from_zone () {
    reply=(`dig axfr ouraynet.com @ns1.ouraynet.com | grep -e '^[a-z]' | cut -d\. -f1`)
}
compctl -x 'p[1]' -K complete_host_from_zone -- ssh

नोट: उपरोक्त कोड आपके कॉन्फ़िगरेशन में ssh कमांड के लिए पूरी तरह से पूरी तरह से सिस्टम को प्रतिस्थापित नहीं कर सकता है। यदि आपको इसके साथ कोई समस्या है, तो "ssh" कमांड को कुछ अन्य यादृच्छिक कमांड जैसे "mycompletetest" में बदलने का प्रयास करें और देखें कि क्या पूरा करने के लिए काम करता है।

यह भी ध्यान दें कि यह हर पूरा होने पर डीएनएस ज़ोन ट्रांसफर करता है! यदि आप इसका बहुत अधिक या काफी स्थिर डोमेन पर उपयोग करते हैं, तो यह लुकअप करने और परिणाम को बचाने के लिए समझ में आता है, तो आपके लुकअप फ़ंक्शन में बस रिप्लाई = zone_result सेट करें।


मुझे वह बिल्कुल नहीं मिल सकता है। जाहिर है मुझे उत्तर भाग को बदलना होगा, लेकिन क्या आप स्थैतिक पाठ के साथ काम करने का उदाहरण दे सकते हैं, इसलिए मुझे पता है कि यह किस प्रारूप में होना चाहिए? (मैंने कोशिश की कि मैं क्या कहने के लिए मैन पेज को समझ गया, और -k -K को सही कर दिया, और यह अभी भी काम नहीं किया।)
iconoclast

उत्तर प्रारूप बहुत सरल है, यह सिर्फ एक सीधा पाठ बूँद है, प्रति पंक्ति एक संभावित उत्तर। डीएनएस बात शायद मुश्किल हिस्सा है। आपके DNS सर्वर को कार्य करने के लिए ज़ोन स्थानांतरण का समर्थन करना है। इसका आमतौर पर मतलब है कि आपको इस तरह से डोमेन के लिए प्राथमिक डीएनएस सर्वर से बात करनी होगी dig axfr mydomain.com @ns1.mydomain.com। सुनिश्चित करें कि आप मैन्युअल रूप से चला सकते हैं और आउटपुट का हिस्सा उस डोमेन पर पंजीकृत मेजबानों की सूची और उनके ए या जो भी रिकॉर्ड होना चाहिए। यही कारण है कि मैं के लिए greping था, तो केवल hostname भाग काट पूरी तरह से योग्य रिकॉर्ड नहीं।
कालेब

आनंद लें कि मैंने अपने उत्तर में उदाहरण कोड को फिर से लिखा है जिसमें एक डोमेन नाम सहित पूरी तरह से कट और पेस्ट समाधान काम कर रहा है जिसके लिए ज़ोन स्थानांतरण लुकअप काम करता है। फिर आप सूट करने के लिए टेलर कर सकते हैं। जब मैंने इस उदाहरण के लिए प्रासंगिक नहीं है, जो मेरे .zshrc फ़ाइल में थी के बारे में 20 अतिरिक्त परतों को चीर दिया जब मैं मूल से दो टाइपो के साथ समाप्त हुआ था।
कालेब

बैकटिक्स में खुदाई कमांड अब काम करता है (इसे संपादित करने के लिए धन्यवाद!), लेकिन जब मैं ssh <TAB> टाइप करता हूं, तो यह कमांड के किसी भी परिणाम को नहीं दिखा रहा है। क्या इसके बाहर कुछ और है जो काम करने से पहले सक्षम होना चाहिए?
iconoclast

0

मुझे अपनी हैशेड known_hostsफ़ाइल रखना पसंद है और वह HashKnownHostsबंद नहीं होगी । मैंने पाया कि मेरे इतिहास में पहले से ही जो @Gilles है, वह मेरी जरूरतों के लिए काफी प्रभावी है।

h=($(echo $(history | awk '{print $4 " " $5 "\n"}' | grep 'ssh ' | awk '{print $2}' | sort -u)))
if [[ -r ~/.ssh/config ]]; then
  h=($h ${${${(@M)${(f)"$(cat ~/.ssh/config)"}:#Host *}#Host }:#*[*?]*})
fi
if [[ -r ~/.ssh/known_hosts ]]; then
   h=($h ${${${(f)"$(cat ~/.ssh/known_hosts{,2} || true)"}%%\ *}%%,*}) 2>/dev/null
fi
if [[ $#h -gt 0 ]]; then
  zstyle ':completion:*:ssh:*' hosts $h
  zstyle ':completion:*:slogin:*' hosts $h
fi

इसके अलावा, एफडब्ल्यूआईडब्ल्यू, यह वह है जो मैंने बैश के लिए उपयोग किया है:

# SSH Autocompletion
complete -W "
  $(echo $(grep '^\s*ssh ' ~/.bash_history | sort -u | sed 's/^ssh //' | awk '{print $1}'))
  $(echo $(history | awk '{print $2 " " $3}' | grep 'ssh ' | awk '{print $2}' | sort -u))
  $(sed 's/#.*//;' ~/.ssh/config | awk ' /^Host (.+)$/ {$1 = "";print tolower($0)}')
" ssh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.