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 -f. compgen귀하의 경우 이는 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

관련 정보