zsh:SSHの完了ルール

zsh:SSHの完了ルール

では、次のようにzshホスト名を自動補完できます/etc/hosts

ssh f<TAB>

で始まるホストには完了機能がありますf

これは以下で構成されています/usr/share/zsh/functions/Completion/Unix/_hosts

local ipstrip='[:blank:]#[^[:blank:]]#'

zstyle -t ":completion:${curcontext}:hosts" use-ip && useip=yes
[[ -n $useip ]] && ipstrip=
if (( ${+commands[getent]} )); then
  _cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null)"}##${~ipstrip}}})
else
  _cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##${~ipstrip}}})
fi

....

_hosts=( "$_cache_hosts[@]" )

ただし、/etc/hostsファイル形式が「IP」「ホスト名」の場合にのみ機能します。

192.168.1.4      foo.mydomain.com

IP が失われても動作しません。

                 foo.mydomain.com

IPを持たないホスト名も完成するように、完成スクリプトをどのように変更しますか?

/etc/hostsにはIPのホスト名が完成していませんbash_completion。だから私はただそこにいたいと思いますzsh

答え1

あなた(およびシステム)の既知のSSHホストファイルを使用してこのタスクを実行することをお勧めします。

zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })'

それでも/etc/hostsを代わりに使用したい場合:

strip='[:blank:]#[^[:blank:]]#'
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##${~strip}}})'

頑張ってください!

答え2

フィルタ機能の追加/usr/share/zsh/functions/Completion/Unix/_hosts:

provide_missing_ip() {
   while read x ; do 
      set -- $x
      if [ ! "$1" ] || [ "${1%%[^#]*}" ] || [ "$2" ] ; then
          echo "$x"
      else
          ip=`dig +short $2`
          [ "$ip" ] || ip="240.0.0.0"
          printf "%s\t%s\n" $1 $2
      fi
   done
}

仕組み:

  1. 2つの項目(スペースまたはコメント)がある場合は、それを出力してください。
  2. ホスト名のみがある場合は提供してください。知的財産権住所とdig
  3. これが不可能な場合、(してはいけないしかし、これがテスト目的で意図的に偽のホスト名であると仮定すると、無害な仮想ホスト名を使用してください。知的財産権住所240.0.0.0」、(望むよりバンダラミ答え」/dev/nullに対応するIPアドレス)。

新しい関数を使用して、問題のある完了コードgetentの出力を解析します。< /etc/hosts

if (( ${+commands[getent]} )); then
  _cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null | provide_missing_ip )"}##${~ipstrip}}})
else
  _cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(provide_missing_ip </etc/hosts)"}%%\#*}##${~ipstrip}}})
fi

答え3

ファイルはhosts形式である必要があるため、IP_address canonical_hostname [aliases...]プログラムの一部で破損したファイルを解決するのではなく、ホストファイルを回復する方法を取る必要があります。プログラムが破損した場合、他のプログラムにも問題がある可能性があるため、hostsこれはあなたのユースケースの唯一の合理的な解決策です。目標が動的IPであり、上記の解決策を使用したくない場合は、変更されたhostsアドレスに基づいてIPを動的に変更するスクリプトの作成を検討してください。

関連情報