Примеры оберток скриптов: Использование команд Ping и Host

Примеры оберток скриптов: Использование команд Ping и Host

18.03.2024
Автор: HostZealot Team
2 мин.
110

Понимание пользователями команд *nix может быть достигнуто с помощью оберток скриптов. Обертка - это функция, сценарий или псевдоним скрипта, который содержит утилиту или системную команду.

Unix и Linux-подобные ОС могут запускать 64-битные и 32-битные версии приложений. Это означает, что вы можете написать скрипт-обертку, и он выберет и выполнит нужную версию для 64-битной или 32-битной аппаратной платформы. В высокопроизводительной среде можно найти сотни скриптов-оберток, написанных на Python, Shell и Perl для управления и отправки заданий, устранения неполадок, резервного копирования, настройки общего хранилища, получения данных об использовании кластера и многого другого.

В этой статье мы решили поделиться своим практическим опытом и рассказать, как создается скрипт-обертка для улучшения основного инструмента устранения неисправностей.

Преимущества оберток сценариев оболочки

  • Запуск и вызов необходимого задания.
  • Персонализация команд *nix.
  • Полезны в HPC, научных исследованиях и кластерной среде.
  • Это идеальный вариант экономии времени.
  • Передача аргументов по умолчанию сторонним приложениям или бинарных файлам.
  • Обертки идеально подходят для команд или инструментов, которым требуется управление системой, настраиваемые параметры окружения или параметры отправки задания.

Пример: Создание обертки для сценариев оболочки

Следующий скрипт запустит java-приложение kvminit, перенаправив логи в файл и настроив окружение системы:

export JAVA_HOME=${JAVA_HOME:-/usr/java}
export CLASSPATH="/home/vivek/apps/java/class
exec ${JAVA_HOME}/bin/java kvminit "$@" &>/var/log/kvm/logfile

Другой пример скрипта-обертки – работа при остановке/запуске клиента или nfs-сервера:

_me=${0##*/}          # Server or client?
_server="/etc/init.d/rpcbind /etc/init.d/rpcidmapd /etc/init.d/nfslock /etc/init.d/nfs" # list of server init scripts
_client="/etc/init.d/rpcbind /etc/init.d/rpcidmapd /etc/init.d/nfslock" # list of client init scripts
_action="$1"        # stop / start / restart
# activate all scripts with stop or start or restart
runme(){
           local i="$1"
          local a="$2"
           for t in $i
           do
                          $t $a
           done

usage(){
           echo "$_me stop|restart|start|reload|status";
           exit 0
}
[ $# -eq 0 ] && usage
# main logic
case $_me in
           nfs.server) runme "$_server" "$_action" ;;
           nfs.client) runme "$_client" "$_action" ;;
           *) usage
esac

Инструменты поиска и устранения неисправностей: Команды Ping и Host

Основными инструментами устранения неполадок для системных администраторов являются команды host и ping.

  • Команда Host полезна при определении проблем с DNS. Можно получить данные о записях sys для определенных IP-адресов и одновременно имена хостов для устранения неполадок с DNS.
  • Команда Ping необходима для определения связи между устройствами в удаленной или локальной сети.  

Кастомизированная обёртка для Ping

Отправка ping-запроса на домен с удалением протокола, имени пользователя, urls:pass с помощью системы /bin/ping выглядит следующим образом:

ping(){
           local t="$1"
           local _ping="/bin/ping"
           local c=$(_getdomainnameonly "$t")
           [ "$t" != "$c" ] && echo "Sending ICMP ECHO_REQUEST to \"$c\"..."
           $_ping $c
}

Кастомизированная обертка для Host

Для поиска Dns в системе /usr/bin/host используйте следующее:

host(){
           local t="$1"
           local _host="/usr/bin/host"
           local c=$(_getdomainnameonly "$t")
           [ "$t" != "$c" ] && echo "Выполняем поиск DNS для \"$c\"..."
           $_host $c

Использование оригинальных команд Ping и Host

Вам нужно создать скрипт оболочки, который называется $HOME/scripts/wrapper_functions.lib, и заполнить все 3 функции, как показано здесь:

_getdomainnameonly(){
           local h="$1"
           local f="${h,,}"
           # delete protocol part of name
    f="${f#http://}"
    f="${f#https://}"
           f="${f#ftp://}"
           f="${f#scp://}"
           f="${f#scp://}"
           f="${f#sftp://}"
           # delete username or/and username:password part of hostname
           f="${f#*:*@}"
           f="${f#*@}"
           # delete all /foo/xyz.html*
           f=${f%%/*}
           # Reveal only domain name
           echo "$f"
}
ping(){
           local t="$1"
           local _ping="/bin/ping"
           local c=$(_getdomainnameonly "$t")
           [ "$t" != "$c" ] && echo "Sending ICMP ECHO_REQUEST to \"$c\"..."
           $_ping $c
}
host(){
           local t="$1"
           local _host="/usr/bin/host"
           local c=$(_getdomainnameonly "$t")
           [ "$t" != "$c" ] && echo "Performing DNS lookups for \"$c\"..."
           $_host $c
}

После этого отредактируйте $HOME/.bashrc, добавив следующую строку:

source $HOME/scripts/wrapper_functions.lib

Сохраните файл с изменениями, и проверьте все ли работает так, как нужно.

Передача аргументов командной строки через обертку скриптов Bash

_getdomainnameonly(){
           local h="$1"
           local f="${h,,}"
           # delete protocol part of name
    f="${f#http://}"
    f="${f#https://}"
           f="${f#ftp://}"
           f="${f#scp://}"
           f="${f#scp://}"
           f="${f#sftp://}"
           # delete username or/and username:password part of hostname
           f="${f#*:*@}"
           f="${f#*@}"
           # delete all /foo/xyz.html*
           f=${f%%/*}
           # Reveal only domain name
           echo "$f"
}
ping(){
           local array=( $@ )                     
           local len=${#array[@]}     
           local host=${array[$len-1]}
           local args=${array[@]:0:$len-1}
           local _ping="/bin/ping"
           local c=$(_getdomainnameonly "$host")
           [ "$t" != "$c" ] && echo "Sending ICMP ECHO_REQUEST to \"$c\"..."
           # pass host and args
           $_ping $args $c
}
host(){
           local array=( $@ )
           local len=${#array[@]}
           local host=${array[$len-1]}
           local args=${array[@]:0:$len-1}
           local _host="/usr/bin/host"
           local c=$(_getdomainnameonly "$host")
           [ "$t" != "$c" ] && echo "Performing DNS lookups for \"$c\"..."
           $_host $args $c
}

Подведем итоги

Мы поделились функциями и небольшими скриптами, которые могут выполнять операции для достижения нужных результатов. Чтобы создать другую функциональность, необходимо иметь существующие бинарные файлы и повторно использовать код.

# Как сделать Поделиться:
Статьи по Теме