10 полезных утилит для использования в сценариях






Бытует мнение, что shell-сценарии могут обеспечивать пользовательский интерфейс лишь на уровне возможностей командной строки. Однако это не так. При помощи небольшого набора инструментов вы можете снабдить ваши сценарии дружелюбным графическим (меню, прогрессбары, диалоги и т. п.), текстовым (управлять цветом текста, перемещать курсор в любую позицию окна терминала и т. п.) пользовательским интерфейсом, а также легко работать с UNIX-сокетами. При помощи описанных ниже утилит вы можете создавать удобные и изящные с пользовательской точки зрения сценарии оболочки.

Создание GUI-приложений обычно является дорогим по времени и трудозатратам удовольствием. К счастью, UNIX и Linux снабжены средствами, позволяющими внедрять GUI-элементы в ваши shell-сценарии легко и быстро. Описываемые ниже инструменты тестировались автором на FreeBSD, но должны корректно работать и на многих остальных UNIX-системах.


notify-send

При помощи утилиты notify-send вы можете показывать всплывающие уведомления путём отправки сообщений через notification daemon из командной строки. Очень удобный способ сообщать пользователям о каких-то событиях. Прежде, чем вы сможете воспользоваться этой утилитой, её необходимо установить, поскольку обычно она не установлена по умолчанию. В Ubuntu программа устанавливается так:

sudo apt-get install libnotify-bin

Теперь можно отправлять уведомления прямиком на рабочий стол пользователю:

notify-send "rsnapshot done :)"

Также notify-send принимает опции, при помощи которых можно управлять отображением. С ними можно ознакомиться на man-странице программы.

tput

При помощи утилиты tput вы можете получить дополнительные возможности при работе с терминалом, такие как:

  • перемещение курсора в любую позицию экрана;
  • получение информации о терминале;
  • установка цвета символов и фона;
  • печать жирным шрифтом;
  • печать в инверсном режиме и т. п.

Пример кода с использованием tput:

#!/bin/bash

# clear the screen
tput clear

# Move cursor to screen location X,Y (top left is 0,0)
tput cup 3 15

# Set a foreground colour using ANSI escape
tput setaf 3
echo "XYX Corp LTD."
tput sgr0

tput cup 5 17
# Set reverse video mode
tput rev
echo "M A I N - M E N U"
tput sgr0

tput cup 7 15
echo "1. User Management"

tput cup 8 15
echo "2. Service Management"

tput cup 9 15
echo "3. Process Management"

tput cup 10 15
echo "4. Backup"

# Set bold mode
tput bold
tput cup 12 15
read -p "Enter your choice [1-4] " choice
tput clear
tput sgr0
tput rc

Вот, что получится в результате:

Если вас заинтересовали возможности tput, вы можете получить больше информации на страницах man tput и man 5 terminfo.

setleds

При помощи команды setleds вы можете включать/отключать светодиоды клавиатуры. Например, чтобы включить Num Lock:

setleds -D +num

отключить Num Lock:

setleds -D -num

И, соответственно:

  • +caps — включить Caps Lock;
  • -caps — отключить Caps Lock;
  • +scroll — включить Scroll Lock;
  • -scroll — отключить Scroll Lock.

Более подробно о возможностях setleds можно узнать из man setleds.

zenity

При помощи zenity вы можете отображать GTK-диалоги и получать обратно ответы пользователя. Ниже приведён пример использования zenity в сценарии получения whois-информации.

#!/bin/bash
# Get domain name
_zenity="/usr/bin/zenity"
_out="/tmp/whois.output.$$"
domain=$(${_zenity} --title  "Enter domain" \
	            --entry --text "Enter the domain you would like to see whois info" )

if [ $? -eq 0 ]
then
  # Display a progress dialog while searching whois database
  whois $domain  | tee >(${_zenity} --width=200 --height=100 \
  				    --title="whois" --progress \
			            --pulsate --text="Searching domain info..." \
                                    --auto-kill --auto-close \
                                    --percentage=10) >${_out}
  # Display back output
  ${_zenity} --width=800 --height=600  \
	     --title "Whois info for $domain" \
	     --text-info --filename="${_out}"
else
  ${_zenity} --error \
	     --text="No input provided"
fi

Так это выглядит в работе:

С полным перечнем поддерживаемых виджетов GTK+, а также справкой по работе с zenity можно ознакомиться на man-странице программы, а также при помощи команды

zenity --help

kdialog

kdialog подобен zenity, однако он использует возможности библиотеки QT, а не GTK+. Пример использования:

kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."

На странице shell scripting with KDE Dialogs можно получить больше информации о работе с kdialog.

dialog

При помощи dialog вы можете создавать пользовательский интерфейс в терминале, используя возможности библиотеки ncurses. Например:

#!/bin/bash
dialog --title "Delete file" \
--backtitle "Linux Shell Script Tutorial Example" \
--yesno "Are you sure you want to permanently delete \"/tmp/foo.txt\"?" 7 60
# Get exit status
# 0 means user hit [yes] button.
# 1 means user hit [no] button.
# 255 means user hit [Esc] key.
response=$?
case $response in
   0) echo "File deleted.";;
   1) echo "File not deleted.";;
   255) echo "[ESC] key pressed.";;
esac

Подробности о работе с dialog — на man-странице программы.

Помимо рассмотренных выше утилит, предоставляющих возможность построения пользовательских интерфейсов, со многими UNIX/Linux поставляются и другие. Некоторые из них:

  • xmessage — умеет выводить диалоги с кнопками и сообщениями;
  • gmessage — GTK+ аналог xmessage;
  • whiptail — похожа на dialog;
  • python-dialog — dialog-модуль для Python.

logger

Утилита logger представляет собой интерфейс к syslog. При помощи этой программы вы можете отправлять сообщения о событиях для регистрации в системном лог-файле или каком-либо другом.

logger "Hello World"
tail /var/log/messages
Jan 11 15:11:19 adesktop ashep: Hello World

За справкой традиционно обращайтесь к man logger.

setterm

При помощи утилиты setterm можно управлять различными параметрами терминала. В приведённом ниже примере устанавливается время гашения экрана монитора равным 15 минутам, а переключение в энергосберегающий режим — 60:

setterm -blank 15 -powersave powerdown -powerdown 60

В следующем примере текст в xterm будет выведен подчёркнутым:

setterm -underline on;
echo "Add Your Important Message Here"
setterm -underline off

Также, например, вы можете отключить отображение курсора на экране:

setterm -cursor off

и затем включить его:

setterm -cursor on

За подробностями по работе с программой — man setterm.

Отправка сообщений хостам MS Windows

При помощи утилиты smbclient можно отправлять текстовые сообщения пользователям хостов SMB/CIFS, если на них запущена соответствующая служба.

echo "Hello World" | smbclient -M hostname

Документация: man smbclient.

Работа с сокетами из bash

Непосредственно из bash вы можете открывать сокеты и передавать через них данные. Вам вовсе необязательно пользоваться curl или lynx, чтобы получить данные по сети от удалённого сервера. Bash особым образом интерпретирует обращения к файлам:

  • /dev/tcp/host/port — если host является корректным именем хоста, а port — номером порта, то bash попытается открыть сетевое соединение к этому хосту на указанный TCP-порт;
  • /dev/udp/host/port — то же самое, только речь идёт о UDP-соединениях.

Используя это, вы можете, например, определять, открыт или закрыт определённый порт:

(echo >/dev/tcp/localhost/25) &>/dev/null && echo "TCP port 25 open" || echo "TCP port 25 close"

Обернув вышеприведённый пример в цикл, можно проверять диапазон портов:

echo "Scanning TCP ports..."
for p in {1..1023}
do
  (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open"
done

А при помощи следующего примера можно сделать так, чтобы ваш сценарий работал подобно HTTP-клиенту.

#!/bin/bash
exec 3 <> /dev/tcp/${1:-www.cyberciti.biz}/80

printf "GET / HTTP/1.0\r\n" >&3
printf "Accept: text/html, text/plain\r\n" >&3
printf "Accept-Language: en\r\n" >&3
printf "User-Agent: nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}" >&3
printf "\r\n" >&3
while read LINE

Больше информации, как всегда, вы можете получить на man-странице bash.

Замечание о заданиях cron и GUI-приложениях

Если вы планируете запускать ваши сценарии, написанные с использованием Zenity или ей подобными, не забывайте прежде определять значение переменной DISPLAY в строке описания задания файла crontab. Например:

@hourly  DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh

Оригинал статьи на cyberciti.biz




10 полезных утилит для использования в сценариях: 7 комментариев

  1. Большое спасибо. Я раньше пользовался только dialog но теперь все в одном месте — очень удобно.

  2. $ setleds -D +caps

    KDGKBLED: Недопустимый аргумент

    Error reading current flags setting. Maybe you are not on the console?

  3. А как принять TCP соединение? А после полученную через него строку передать как параметр другой команде?

  4. Работает сие only в консоли, те которые вызываются напр. на Kubuntu как Ctrl+Alt+F1...F6

    А к примеру в gnome-terminal или Konsole это не работает.

    То же самое у меня.

    Это для действительно консоли, а не эмулятора терминала.

Комментарии запрещены.