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 

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 
  • ssh_config: добавить раздел хоста, который соответствует IP-адресам, даже при подключении через имя хоста
  • RHEL ip n Подключенное устройство имеет устаревшее соединение?
  • Выбор правила маршрутизации
  • SSH: оболочка открыта в пространстве имен IP
  • Как добавить два шлюза на одном компьютере
  • Есть ли способ определить IP-адрес модема / маршрутизатора?
  • Почему я могу настроить IP-адрес на мостовом интерфейсе?
  • быстрый фильтр IP, вызывающий DOS для sendmail под FreeBSD
  • «Легальное» отравление ARP машинным агрегатом 2 сетевых адаптера нарушает нас
  • Проблема с таймером IPv6 NDP
  • IP локального хоста
  • Linux и Unix - лучшая ОС в мире.