এসএসএইচ এবং এসসিপি-র জন্য স্বতঃসিদ্ধ সার্ভারের নাম


61

আমার কয়েকটি সার্ভার কনফিগার করা আছে ~/.ssh/config, যেমন alphaএবং beta। আমি কিভাবে ব্যাশ যেমন যে কমান্ড কনফিগার পারে ssh al<tab>এবং scp file.tgz al<tab>কনফিগার সার্ভারের নাম স্বয়ংসম্পূর্ণ?

যখনই আমরা সার্ভারগুলিকে নিয়মিত যুক্ত করি এবং মুছি এবং তালিকাটি বেশ বড় হয় ততবার আমি প্রতিটি ফাইল যুক্ত হওয়ার সাথে সাথে অন্য ফাইলগুলিতে (অর্থাত্ কোনও ব্যাশ অ্যারে) সার্ভারগুলি যুক্ত করতে চাই না ।


2
আপনার ডিস্ট্রোতে কি বাশ-সম্পূর্ণকরণ প্যাকেজ ইনস্টল করা আছে? আমি মনে করি এটি স্ট্যান্ডার্ড সমাপ্তির রুটিনের একটি অংশ, যদিও আমি এটি zsh এর সাথে বিভ্রান্ত করছি।
কালেব

আমার ইনস্টলটি ঠিক এটি করে।
slm

এটি কুবুন্টু 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

Script স্ক্রিপ্টটি এতে রাখুন /etc/bash_completion.d/sshএবং তারপরে নিম্নলিখিত কমান্ডটি দিয়ে এটি উত্স করুন:

$ . /etc/bash_completion.d/ssh

আমি এই গাইডটি অমূল্য পেয়েছি এবং এটি ছাড়া আমি এটির স্ক্রিপ্ট করতে সক্ষম হত না। স্টিভ কেম্পকে সেই দুর্দান্ত চিত্রটি লেখার জন্য ধন্যবাদ !


1
দেখে মনে হয় যে সেন্টোসে ~ / .ssh / ज्ञात_হোস্টের ওভার রাইড এন্ট্রিগুলিতে ~ / .ssh / কনফিগারেশন যেমন over আপনার যদি foo.bar.baz.com পরিচিত_হোস্টগুলিতে থাকে তবে আপনি যদি "ssh foo" করেন তবে এটি পুরো জিনিসটির সাথে মিলবে <ট্যাব> - আপনার যদি কোনও ভিন্ন ব্যবহারকারী বা অন্যান্য সেটিংস থাকে তবে আপনি ssh সংলাপ থেকে প্রয়োগ করতে পারেন এটি অনাকাঙ্ক্ষিত। আপনার যদি ssh কনফিগারেশনে এন্ট্রি থাকে যা সঠিকভাবে স্বতঃপূরণ হয় না তবে এটি ज्ञात_হোস্টগুলিতে উপস্থিত কিনা তা পরীক্ষা করে এটি মুছুন। কনফিগার থেকে সেটিংস গ্রহণ করা এখন স্বাভাবিক হিসাবে কাজ করা উচিত।
ইমরান-ইউকে

@ ইমরান-ইউকে: জানা গেছে যে সুরক্ষার ভান করে উবুন্টু সেই বুদ্ধিমান কাজটি করেন না। স্পষ্টতই চিন্তাভাবনাটি হ'ল ডিরেক্টরিতে chmod 0600 সত্ত্বেও কোনও দূষিত সত্তা, ব্যবহারকারী হিসাবে, ~ / .ssh / config সম্পাদনা করতে পারে। আরে, আমিই যে সিদ্ধান্ত নিয়েছিলাম!
dotancohen

1
আমি zsh এবং ওহ-আমার-zsh ব্যবহার করি, আমি সবেমাত্র আবিষ্কার করেছি যে "ssh" প্লাগইন সক্ষম করে এবং আমার। / .Ssh / কনফিগারেশনে "হ্যাশকেনডাউনস্টস হ্যাঁ" লাগানো সঠিক কাজটি করছে বলে মনে হচ্ছে। আপনি শেল পরিবর্তন করতে পারেন যাই হোক না কেন ডিস্ট্রো তাই এটি এর চারপাশে একটি উপায় হতে পারে।
ইমরান-ইউকে

@ ইমরান-ইউকে: বাস্তবে আমি অতীতে zsh চেষ্টা করেছি এবং আবার চেষ্টা করার চেষ্টা করি। আমি এটি খতিয়ে দেখব। আমার বন্ধু শুক্রন!
dotancohen

আমি জানি যে আমি পার্টিতে কিছুটা দেরি করেছি, তবে আরএইচইএল 7 স্বয়ংক্রিয়ভাবে সম্পূর্ণ প্রবেশিকাভুক্ত করবে /etc/hosts, অন্য ডিস্ট্রোরাও এটি করতে পারে।
সেন্টটিমান

16

প্রাক প্যাকেজ

আপনি কী ডিস্ট্রো ব্যবহার করছেন তা আপনি বলবেন না তবে আমার ফেডোরা 19 সিস্টেমে আমার কাছে নীচের প্যাকেজটি ইনস্টল করা আছে bash-completionযা এই সমাপ্তির নিয়ম ফাইলের মাধ্যমে এই বৈশিষ্ট্যটি সরবরাহ করে:

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

আমি যে প্যাকেজটি ইনস্টল করেছি তা এখানে:

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

যদি আপনি এই নিয়ম ফাইলটি দেখেন তবে আপনি এমন স্টাঞ্জগুলি দেখতে পাবেন যা $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"

আপনার নিজের ঘূর্ণায়মান

আমি এই গিস্টটিও খুঁজে পেয়েছি, ज्ञात_হোস্ট_আউটোকোম্পলিট.শ , এটি $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ইতিমধ্যে প্রাক-প্যাকেজযুক্ত জন্য সম্পূর্ণ করার নিয়ম ফাইলটি খুঁজে পেতে অক্ষম হন ।


ধন্যবাদ. দেখে মনে হচ্ছে উবুন্টু জাহাজে করে না /usr/share/bash-completion/completions/ssh। আপনি কি পুরো ফাইলটি কোথাও পোস্ট করতে পারেন যাতে আমি এটি অনুলিপি করতে পারি? ধন্যবাদ!
dotancohen

: আপনি এই সংরক্ষণাগার থেকে সব ফাইল পেতে পারেন pkgs.fedoraproject.org/repo/pkgs/bash-completion/...
SLM

আমি ব্যথার জন্য দুঃখিত, তবে সেই টার আর্কাইভ থেকে ssh ফাইলটি অনুলিপি করেও /usr/share/bash-completion/completions/sshকোনও লাভ নেই! complete -W ...বাশ প্রম্পট থেকে কমান্ডটিও চালাচ্ছে না । এখানে সমস্যা কি হতে পারে?
dotancohen

ধন্যবাদ. এটি উবুন্টুতে একটি পরিচিত নকশার সিদ্ধান্ত বলে মনে হয় । সুতরাং আমি উত্তর যদিও আমি ব্যাশ সমাপ্তির জন্য কাজ পেতে পারে না গ্রহণ করছি sshবা scp
ডটানকোহেন

2
ওএসএক্সের হোমব্রুতেও এটি রয়েছে: বাশ-সমাপ্তি এবং zsh- সম্পূর্ণকরণ
অ্যাডাম নেলসন

7

আমি দেখতে পেলাম যে স্বতঃসমম্পূর্ণ কাজ করছে না কারণ উবুন্টু হোস্টগুলি পরিচিত করে। তুমি যোগ করতে পার

Host *
    HashKnownHosts no

আপনার .ssh/configফাইলে তবে বিদ্যমান হোস্টগুলি আন-হ্যাশ করা হবে না।


ধন্যবাদ. আমি ইতিমধ্যে এই নির্দেশকে ইতিমধ্যে যুক্ত করেছি ~/.ssh/configএবং দিকনির্দেশটি পরিবর্তন /etc/ssh/ssh_configকরেছি এবং আমি ~/.ssh/known_hostsফাইলটি সরিয়েছি । আবার সার্ভারগুলিতে লগ ইন করার পরে, হোস্টের নামগুলি এখনও হ্যাশ করে সংরক্ষণ করা হচ্ছে।
dotancohen

আমি আমার উত্তর সম্পাদনা করেছি; আপনাকে একটি হোস্ট নির্দিষ্ট করতে হবে এবং ভিতরে হ্যাশ নির্দেশিকা বাসাতে হবে; .ssh/configইতিমধ্যে যতগুলি ফাইলের এই লাইন থাকবে তা আমি তালিকাভুক্ত করিনি । যদি এটি কাজ করে তবে আমাকে জানান।
এম 1ke

এটি অবশ্যই এটি করার সহজ উপায়! উবুন্টু এখন ssh সমাপ্তি সক্ষম করেছে (এর নতুন সংস্করণ) দেওয়া, সম্ভবত এটিই চেয়েছিল।
জন মন্টগোমেরি

আমি নীচে যুক্ত হিসাবে, আপনি এটি করতে পারেন, তবে আপনার সম্ভবত করা উচিত নয় - যাইহোক আপনার কাজ শেষ করার জন্য আপনার প্রয়োজন হবে না। তবে, আপনি যদি সম্মত না হন এবং উপরেরটি যোগ করার পরে বিদ্যমান হোস্টগুলি কেবল হ্যাশ করতে চান, আপনি কেবলমাত্র m / .ssh / ज्ञात_হোস্টগুলি করতে পারেন, এবং এটি যখনই পুনরায় তৈরি করতে সক্ষম হবে (আন-হ্যাশ) আপনি একটি নতুন সার্ভারে লগ ইন করুন।
জ্যামিসন বেকার 0

3

দেবিয়ান এবং উবুন্টুতে এসএসএস অটোমোપ્লেশন সক্ষম করতে:

sudo apt-get install bash-completion

মনে রাখবেন যে এটি উপরের বর্ণিত ও আসল প্রশ্নের বিপরীতে জ্ঞাত_ হোস্টিংয়ের সাথে কিছু করার নেই । আপনি known_hosts থেকে স্বয়ংসম্পূর্ণ করতে চেয়েছিলেন, তাহলে অবশ্যই আপনি হ্যাশ নিষ্ক্রিয় করতে পারে, কিন্তু যে দৃঢ়ভাবে বিরুদ্ধে সুপারিশ করেন।

উদাহরণস্বরূপ, আমার আছে:

Host *
    HashKnownHosts yes

আমার .ssh / কনফিগারেশনে এবং আমি এখনও .ssh / কনফিগারেশন এবং / ইত্যাদি / হোস্টের তালিকাভুক্ত হোস্টের বিরুদ্ধে ঠিক কাজ করে ssh অটো-সম্পূর্ণতা পেয়েছি। অপারেশন হিসাবে আপনাকে হোস্টটি .ssh / কনফিগারেশনে যুক্ত করতে হবে:

আমার-দারুণ-হোস্ট হোস্টনেম the.real.host.name হোস্ট করুন

(অথবা, আপনি / ইত্যাদি / হোস্টগুলিতে হোস্ট এন্ট্রি যুক্ত করতে পারেন যা দেবিয়ান / উবুন্টু স্ক্রিপ্টগুলির জন্য অন্য উত্স)

তারপরে, আপনি কেবল টাইপ করতে পারেন ssh my-awe<tab>এবং এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হবে। আবার, এটি এমনকি যদি আপনি হ্যাশকানাডহস্টস, যা উচ্চ প্রস্তাবিত। (নোট করুন যে ব্যাশ সমাপ্তিটি আপনার ব্যাশ শেলটিতে সক্ষম করা দরকার এবং আপনার বিতরণের জন্য উপরে উল্লিখিত স্ক্রিপ্টগুলি বিশেষত ইনস্টল করা দরকার))

তারপর, আপনার কাছে এই লাইন যোগ .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

উবুন্টু 14.04 এ, sshআপনার উল্লিখিত সার্ভারগুলি স্বয়ংক্রিয়ভাবে সম্পূর্ণ করে~/.ssh/config

আমি এটি লক্ষ্য করেছি যখন আমি বুঝতে পারি যে আমি সাধারণত যে সমস্ত সার্ভারগুলিতে অটো-সম্পন্ন হয়েছি সেগুলিতে অ্যাক্সেস করি। উভয়ের মধ্যে কেবলমাত্র পার্থক্যটি ছিল ssh কনফিগারেশনের একটি প্রবেশিকা যা প্রমাণীকরণের সাথে সম্পর্কিত। আমি যখন অন্য সার্ভারের জন্য কনফিগার ফাইলে একটি নতুন এন্ট্রি যুক্ত করেছি, তখন এটি স্বয়ংক্রিয়ভাবে সম্পূর্ণ করাও শুরু করে।

যারা জিজ্ঞাসা করছিলেন তাদের জন্য এখানে এন্ট্রি দেওয়া হল:

HOST server-name 
    GSSAPIAuthentication=no

আপনি কনফিগারেশনে নির্দিষ্ট করে যা উল্লেখ করেছেন তা যদি গুরুত্বপূর্ণ হয় (তবে এটি এখনও বৈধ, অবশ্যই)।


আপনাকে নোহ ধন্যবাদ, এন্ট্রি কি ছিল? আমার 14.04 এবং 14.10 সিস্টেমে স্বয়ংক্রিয়রূপে কাজ হয় না।
dotancohen

আমি মনে করি না যে এন্ট্রির বিষয়টি গুরুত্বপূর্ণ - আমি নিশ্চিত যে এটি কেবল সেখানেই রয়েছে - তবে আমি আমার উত্তরে এন্ট্রি যুক্ত করব।
নোহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.