IPをホスト名として解決するためのbash_completionルール

IPをホスト名として解決するためのbash_completionルール

bash_completion私のスクリプトのルールを作成しようとしていますrmpxe。スクリプトは<hostname>これを唯一のパラメータとして使用します。次に、対応するホスト名を確認し、対応する<ip_address>シンボリックリンクを削除します/srv/tftp/pxelinux.cfg/<ip_address>

<ip_address>シンボリックリンクのIPアドレス/srv/tftp/pxelinux.cfg/<ip_address>は16進形式ですが、getnameinfoこの16進IPアドレスをホスト名に解析する単純なプログラムをC()で作成しました。

したがって、私のプログラムを使用してgetnameinfo16進IPからホスト名を取得できます。

$ getnameinfo 0A6F010B
server1.mydomain.com

たとえば、次のコマンドはシンボリックリンクを削除します。/srv/tftp/pxelinux.cfg/0A6F010B

 $ rmpxe server1.mydomain.com

今私のbash_completion問題は次のとおりです。次のコードを作成し、ホスト名を完成させるのではなく(私のスクリプトが期待するように)16進IPアドレス(たとえば、私のディレクトリシンボリックリンクファイル内のアドレス)を/srv/tftp/pxelinux.cfg/完成させる以外はうまくいきます。パラメータがオートコンプリートされる前に、まずホスト名を解決するためにこのコードに組み込む必要があります。

_rmpxe()
{
    local word
    COMPREPLY=()

    if [ 1 -eq "$COMP_CWORD" ]; then
      pushd /srv/tftp/pxelinux.cfg &>/dev/null || return 1
      word="${COMP_WORDS[COMP_CWORD]}"
      COMPREPLY=($(compgen -f "$word"))
      popd &>/dev/null
    fi

}
complete -F _rmpxe rmpxe

つまり、現在のbash完了操作は次のようになります。

$ ls /srv/tftp/pxelinux.cfg
0A6F010B 0A6F010C 0A6F010D 0A6F010E

$ rmpxe <tab>
0A6F010B 0A6F010C 0A6F010D 0A6F010E

ただし、次のように動作するために必要です。

$ rmpxe <tab>
server1.mydomain.com server2.mydomain.com server3.mydomain.com

答え1

を使用したため、現在のパスの下のすべてのファイルとディレクトリが一覧表示されますcompgen -fcompgenあなたの場合これは0A6F010B 0A6F010C 0A6F010D 0A6F010E

ホスト名を取得するには、現在のパスを繰り返し、各IPを供給してgetnameinfoそのIPに対応するホスト名を取得し、それを配列に保存してからこの配列を使用できますcompgen -W

私の環境で簡単なテストをしてみました。ファイルを作成しました/etc/bash_completion.d/cuonglm

_rmpxe() {
  local word
  COMPREPLY=()

  if [ 1 -eq "$COMP_CWORD" ]; then
    pushd /home/cuonglm/test &>/dev/null || return 1
    word="${COMP_WORDS[COMP_CWORD]}"
    HOST_ARR=()
    for i in *; do
      HOST_ARR+=($(/home/cuonglm/getnameinfo "$i"))
    done
    COMPREPLY=($(compgen -W "$(printf "%s " "${HOST_ARR[@]}")" -- "$word"))
    popd &>/dev/null
  fi
}
complete -F _rmpxe cuonglm

いくつかの修正を経て、フル機能を使用しました。

  • ホスト名を保存するために配列を使用していますHOST_ARR
  • 現在のディレクトリを繰り返しながら(pushd以前に感謝します)、各ファイル名をgetnameinfoプログラムに入力します。
  • その後、compgenを使用してcompgen -W完成する単語のリストを作成しました。

結果は次のとおりです。

$ cuonglm <Tab>
$ cuonglm server<Tab>
server1.example.com  server2.example.com

どちらのホスト名も同じ部分を持つため、serverbashは自動的にこの部分を最初に完了します。別のホスト名がある場合Server.example

$ cuonglm <Tab>
Server.example server1.example.com  server2.example.com

関連情報