Приклади обгорток скриптів: Використання команд Ping та Host

Приклади обгорток скриптів: Використання команд Ping та Host

18.03.2024
Автор: HostZealot Team
2 мін.
167

Зрозумілість для користувачів команд *nix можна досягти за допомогою обгорток сценаріїв командного інтерпретатора. Обгортка - це функція оболонки, сценарій оболонки або alias, який містить утиліту або системну команду.

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

Відправлення пінг-запиту до домену, видаливши протокол, ім'я користувача, 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 "Performing DNS lookups for \"$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
}

Підсумки

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

# Як зробити Поділитися:
Статті за темою