このSSHホスト名タブの完成スクリプトを変更するには?

このSSHホスト名タブの完成スクリプトを変更するには?

次のスクリプトを探してください(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

関連情報