Zsh এ ssh এর জন্য কমান্ড সমাপ্তি কীভাবে সম্পাদনা করবেন?


11

আমি টাইপ করার পরে হোস্টের নামগুলি প্রদর্শন করতে zsh এ কমান্ড সমাপ্তি স্থাপন করতে চাই

ssh [TAB]

নামগুলি আমার .ssh / কনফিগারেশন ফাইলের বাইরে নিয়ে যাওয়া (এবং সম্ভবত পরিচিত_হোস্ট এবং / ইত্যাদি / হোস্ট এবং অন্য যে কোনও জায়গা থেকে বোঝা যায়) এবং একটি একক তালিকা উপস্থাপন করা।

এটি বর্তমানে এটি কিছু করে, কিন্তু

  1. এটি মোটেই .ssh / কনফিগারেশন ব্যবহার করে না
  2. এটি প্রথমে একটি ব্যবহারকারীর নাম প্রয়োজন, যদিও .ssh / কনফিগারেশন ব্যবহার করে টাইপ করা ব্যবহারকারীর নাম অপ্রয়োজনীয় হয়ে যায়
  3. এটি একাধিক তালিকা উপস্থাপন করে (সম্ভবত একটি পরিচিত_হোস্ট থেকে এবং অন্যটি / ইত্যাদি / হোস্ট থেকে, তবে আমি এটি যাচাই করি নি)

সুতরাং আমি ssh টাইপ করার পরে (পছন্দসই একক) তালিকায় পরিচিত নাম ব্যবহারকারীর নাম এবং সেই সাথে পরিচিত হোস্টনামগুলি অন্তর্ভুক্ত করতে চাই [

(আমি গুগলের আগে এখানে আসছি কারণ 1) এর ফলাফল এখানে সঞ্চিত হয়ে যাবে এবং 2) এটি সম্ভবত আরও দক্ষ। অন্য কেউ উত্তর না দিলে আমি উত্তরটি সন্ধান করব।)


এটি সুপারভাইজারের জন্য একটি প্রশ্ন হবে, আমি মনে করি
এতিয়েন পেরট

প্রকৃতপক্ষে, এখন এটি খুঁজছেন আমার unix.stackexchange.com এ জিজ্ঞাসা করা উচিত ছিল। (তবে আমি মনে করি না যে এটি প্রায় 2 বছর আগে আমি যখন জিজ্ঞাসা করেছি তখন।) যে কেউ এটি স্থানান্তর করতে চান?
আইকনোক্লাস্ট

উত্তর:


16

এখানে আমার থেকে প্রাসঙ্গিক অংশ .zshrc। এটি ২০০২ সালের পরে পরিবর্তিত হয়নি, তাই আমি আজ এটি অন্যভাবে লিখতে পারি, তবে এটি এখনও হোস্টের নামগুলি সম্পূর্ণরূপে কাজ করে ~/.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ডকুমেন্টেশনের (বিশেষত "হোস্ট" তে অনুসন্ধান করুন যা একাধিক জায়গায় প্রদর্শিত হবে এবং "ssh" যা বেশ কয়েকটি জায়গায় প্রদর্শিত হবে)।

এটি সম্পন্ন ফাংশনটি পরিবর্তন না করে আপনি যা সন্ধান করছেন তাতে 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" কমান্ডটি পরিবর্তন করে দেখুন এবং এটির জন্য কাজটি সম্পূর্ণরূপে কাজ করে কিনা।

এছাড়াও নোট করুন যে এটি প্রতিটি সমাপ্তির পরে ডিএনএস জোন স্থানান্তর করে! যদি আপনি এটি অনেক কিছু বা মোটামুটি স্থির ডোমেন ব্যবহার করেন তবে এটি অনুসন্ধান করা এবং ফলাফলটি সংরক্ষণ করা বুদ্ধিমান হতে পারে, তবে আপনার অনুসন্ধানের ফাংশনে কেবল উত্তর = জোন_সাল্ট সেট করুন।


আমি মোটেও এটি কাজ করতে পারি না। স্পষ্টতই আমাকে জবাবের অংশটি পরিবর্তন করতে হবে, তবে আপনি কি স্থির পাঠ্য সহ একটি কাজের উদাহরণ দিতে পারেন, তাই আমি জানি এটির কোন ফর্ম্যাটটি হওয়া উচিত? (আমি ম্যান পেজটি কী বলেছি তা কী বলেছি তা চেষ্টা করেছি এবং কে-কে-কে সংশোধন করেছি এবং এটি এখনও কার্যকর হয়নি))
আইকনোক্লাস্ট

উত্তরের ফর্ম্যাটটি বেশ সহজ, এটি কেবল একটি সরল পাঠ্য ব্লব, প্রতি লাইনে একটি সম্ভাব্য উত্তর। ডিএনএস জিনিস সম্ভবত জটিল অংশ। আপনার ডিএনএস সার্ভারকে কাজ করার জন্য জোন স্থানান্তরকে সমর্থন করতে হবে। এর অর্থ সাধারণত আপনাকে এইরকম প্রশ্নযুক্ত ডোমেনের জন্য প্রাথমিক ডিএনএস সার্ভারের সাথে কথা বলতে হবে dig axfr mydomain.com @ns1.mydomain.com। আপনি নিজে নিজে চালাতে পারবেন তা নিশ্চিত করুন এবং আউটপুটের অংশটি সেই ডোমেনে নিবন্ধিত হোস্টের তালিকা এবং তাদের এ বা যে কোনও রেকর্ড হওয়া উচিত। এটিই আমি গ্রেপিংয়ের জন্য করছি, তারপরে কেবলমাত্র হোস্টনামের অংশটি পুরোপুরি যোগ্য রেকর্ড নয় cut
কালেব

দয়া করে নোট করুন যে আমি আমার উত্তরটিতে উদাহরণ কোডটি পুনরায় লিখেছি যাতে সম্পূর্ণরূপে কাজ করার জন্য কাট এবং পেস্ট সমাধান করা যায় যা একটি ডোমেন নাম সহ জোন স্থানান্তর অনুসন্ধান কাজ করে। তারপরে আপনি স্যুটটি টেইলার করতে পারবেন। আমি মূলটির জন্য কৈফিয়ত দেই যা আমার .zshrc ফাইলে থাকা প্রায় 20 টি অতিরিক্ত স্তর যা এই উদাহরণের সাথে প্রাসঙ্গিক নয় সেগুলি প্রায় দুটি টাইপ দিয়ে শেষ হয়েছিল।
কালেব

ব্যাকটিক্সে ডিগ কমান্ড এখন কাজ করে (এটি সম্পাদনা করার জন্য ধন্যবাদ!) তবে আমি ssh <TAB> টাইপ করার পরে এটি কমান্ডের কোনও ফলাফল দেখায় না। এর বাইরেও কি এমন কিছু আছে যা কাজ করার আগে সক্ষম করা দরকার?
আইকনোক্লাস্ট

0

আমি আমার হ্যাশ রাখা পছন্দ করি known_hosts ফাইলটি এবং পরিবর্তে এটি HashKnownHostsবন্ধ করতে না । আমি খুঁজে পেয়েছি যে আমার ইতিহাসে ইতিমধ্যে যা রয়েছে তার সাথে @ গিলসের যা আছে তা বপন আমার প্রয়োজনের জন্য বেশ কার্যকর হয়েছে quite

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.