私次のスクリプトを探してください(bashの場合)これにより、(から)接続しているすべてのホスト名に対してタブの~/.ssh/known_hosts
完成を得ることができます。
complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh
しかし、問題は、ユーザー名を入力した後にタブの完成が機能しないことです。
これをどのように改善できますか?入力すると...
ssh myusername@my
そして、「myhostname.com」が完了すると予想します。そうできますか?
完全な文字列(user@hostname)にもタグを付けることができる方が良いでしょうが、どちらのオプションも問題ありません。最初のユーザー名がなければ、私のホストユーザー名が私のローカルユーザー名と一致しない限り、これはあまり役に立ちません。
答え1
既定では、既知の_hostsファイルには通常、bash_completionが確認できないハッシュエントリが含まれています。
ssh_config(/etc/ssh/ssh_config)を編集して、次の設定を行うことができます。
HashKnownHosts no
その後、現在知られているホストファイルを消去する必要があります。
> ~/.ssh/known_hosts
答え2
$COMP_WORDBREAKS
「@」(マイシステムのデフォルト)を含めると、解決できない深刻な問題が発生します(押すと「@」Tab1つが削除されます)。Enter
ただし、対応する環境変数から削除すると、次のように動作します。
_foo () {
if [[ "$COMP_WORDBREAKS" =~ "@" ]]; then
echo ""
echo '$COMP_WORDBREAKS contains "@"; aborting'
COMPREPLY=()
else
at_in=no
if [[ ${COMP_WORDS[COMP_CWORD]} =~ "@" ]]; then
var="${COMP_WORDS[COMP_CWORD]}"
tail="${var#*@}"
prefix="${var%"$tail"}"
else
prefix=""
fi
COMPREPLY=($(cut -f 1 -d ' ' <~/.ssh/known_hosts |
sed -e 's/,/\n/g' | uniq |
awk -v prefix="${prefix}" '/\[/ {next}; {print prefix $0;}'))
COMPREPLY=($(compgen -W "${COMPREPLY[*]}" "${COMP_WORDS[COMP_CWORD]}"))
fi
}
complete -F _foo ssh