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

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

08:53, 18.03.2024

Содержание статьи
arrow

  • Преимущества оберток сценариев оболочки
  • Пример: Создание обертки для сценариев оболочки
  • Инструменты поиска и устранения неисправностей: Команды Ping и Host
  • Кастомизированная обёртка для Ping
  • Кастомизированная обертка для Host
  • Использование оригинальных команд Ping и Host
  • Передача аргументов командной строки через обертку скриптов Bash
  • Подведем итоги

Понимание пользователями команд *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
}

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

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

views 6m, 45s
views 2
Поделиться

Была ли эта статья полезной для вас?

Популярные предложения VPS

Другие статьи на эту тему

cookie

Принять файлы cookie и политику конфиденциальности?

Мы используем файлы cookie, чтобы обеспечить вам наилучший опыт работы на нашем сайте. Если вы продолжите работу без изменения настроек, мы будем считать, что вы согласны получать все файлы cookie на сайте HostZealot.