Приклади обгорток скриптів: Використання команд Ping та Host
12:57, 18.03.2024
Зрозумілість для користувачів команд *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
}
Підсумки
Ми поділилися функціями та невеликим скриптом, який може виконувати операції для досягнення необхідних результатів. Для створення іншого функціоналу вам потрібно мати наявні двійкові файли та повторно використовувати код.