bash_completion для разрешения ip в именах хостов

Я пытаюсь создать правило bash_completion для моего скрипта rmpxe . Этот сценарий принимает <hostname> как единственный аргумент. Затем он разрешает это имя хоста в <ip_address> и удаляет соответствующую символическую ссылку /srv/tftp/pxelinux.cfg/<ip_address> .

IP-адрес <ip_address> в /srv/tftp/pxelinux.cfg/<ip_address> находится в шестнадцатеричном формате, но я написал простую программу в C ( getnameinfo ), которая разрешает этот hex-адрес ip в hostname.

Таким образом, я могу использовать свою программу getnameinfo для получения имени хоста из hex ip:

 $ getnameinfo 0A6F010B server1.mydomain.com 

Так, например, следующая команда удалит /srv/tftp/pxelinux.cfg/0A6F010B

  $ rmpxe server1.mydomain.com 

Теперь перед моей проблемой bash_completion : я создал следующий код, который отлично работает, за исключением того, что вместо заполнения имен хостов (как ожидает мой сценарий) он завершает шестнадцатеричные IP-адреса (т. /srv/tftp/pxelinux.cfg/ в моем каталоге /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 

  • Проблемы с DNS-зобом Zookeeper с выборами лидеров при переходе с Windows на Debian
  • Назначение конкретного IP-приложения
  • Пакеты IP-пакетов произвольно
  • Как загрузить файл путем подделки IP-адреса запроса?
  • SSH внезапно перестает работать: «Write Failed: Broken Pipe»
  • Что останавливает наши UDP-пакеты (как он знает, что маршрут не работает)?
  • ядро марсианского источника и от одного и того же IP-адреса
  • Поддерживается ли управление трафиком внутри пространства имен на портах, созданных OpenvSwitch?
  • One Solution collect form web for “bash_completion для разрешения ip в именах хостов”

    Потому что вы используете compgen -f , то есть compgen будет перечислять все файлы и каталог в текущем пути. В вашем случае это означает 0A6F010B 0A6F010C 0A6F010D 0A6F010E .

    Чтобы получить имена хостов, вы можете getnameinfo свой текущий путь, подавать каждый IP-адрес в getnameinfo чтобы получить соответствие имени хоста IP- getnameinfo , сохранить его в массиве, а затем использовать этот массив в качестве compgen -W слов с 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 before), getnameinfo каждое имя файла программе getnameinfo .
    • Затем я использую compgen -W чтобы заставить compgen создать список слов для завершения.

    И вот результат:

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

    Поскольку два имени хоста имеют один и тот же порционный server , так что bash автоматически запустит эту часть. Если есть другое имя хоста, Server.example :

     $ cuonglm <Tab> Server.example server1.example.com server2.example.com 
    Linux и Unix - лучшая ОС в мире.