Примеры оберток скриптов: Использование команд Ping и Host
08:53, 18.03.2024
Понимание пользователями команд *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
}
Подведем итоги
Мы поделились функциями и небольшими скриптами, которые могут выполнять операции для достижения нужных результатов. Чтобы создать другую функциональность, необходимо иметь существующие бинарные файлы и повторно использовать код.