Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Работа в консоли Linux

Bash-скрипты для графического интерфейса

Оригинал: 10 Tools To Add Some Spice To Your UNIX Shell Scripts
Автор: Vivek Gite
Дата: 22 мая 2010
Свободный перевод: Алексей Дмитриев
Дата перевода: 7 июля 2010

Считается непреложным, что скрипты оболочки Bash предназначены для интерфейса командной строки. Но существует ряд программ, позволяющих создавать скрипты оболочки Bash, взаимодействующие с графическим интерфейсом пользователя (GUI). Такие скрипты можно использовать в самых различных виджетах, типа меню, всплывающих предупреждений, индикаторов и тому подобных. С их помощью можно контролировать вид и содержание, положение на экране, всевозможные эффекты и так далее.

Создавать графическое приложение долго и сложно. Другое дело программы для создания GUI скриптов. Предлагаемые 10 программ проверены на FreeBSD и на Linux и, несомненно, будут работать и на других Юниксовидных операционных системах.

Программа 1: Команда notify-send

Команда notify-send позволяет посылать на рабочий стол пользователя сообщения и предупреждения прямо из командной строки. Это позволяет информировать пользователя рабочей станции о каком-либо событии, либо выдавать на его рабочий стол любую информацию.

Для начала следует установить необходимый пакет:

$ sudo apt-get install libnotify-bin

Теперь, для примера, пошлем из командной строки простое предупреждение:

notify-send "rsnapshot done :)"

Вот что получится:

Вот пример другого кода с дополнительными опциями:

....
alert=18000
live=$(lynx --dump http://money.rediff.com/ | grep 'BSE LIVE' | awk '{ print $5}' | sed 's/,//g;s/\.[0-9]*//g')
[ $notify_counter -eq 0 ] && [ $live -ge $alert ] && { notify-send -t 5000 -u low -i   "BSE Sensex touched 18k";  notify_counter=1; }
...

А вот что получится:

В приведенном примере кода:

  • -t 5000: Указывает время в миллисекундах (5 000 миллисекунд = 5 секунд)
  • -u low : Указывает уровень срочности (низкий=low, средний=normal, срочный=critical)
  • -i gtk-dialog-info : Указывает имя файла картинки для вывода (можно указывать путь к готовой картинке как -i /path/to/your-icon.png)

Подробнее об использовании утилиты notify-send читайте в мане этой программы.

Программа 2: команда 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 5 terminfo
man tput

Программа 3: Команда setleds

Команда setled позволяет регулировать включение светодиодов на клавиатуре, например:

setleds -D +num

включит огонек на клавише NumLock, а команда

setleds -D -num

отключит его.

Вот остальные опции:

  • -caps : выключить CapsLock
  • +caps : включить CapsLock
  • -scroll : выключить ScrollLock
  • +scroll : включить ScrollLock

В мане команды setleds имеются дополнительные подробности.

Программа 4: Команда zenity

Команда zenity выводит на рабочий стол интерактивные диалоговые окна, а также возвращает ввод пользователя. Это позволяет предоставлять пользователю информацию, запрашивать у него информацию при помощи любых скриптов Bash. Вот пример графического клиента для сервиса 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

Вот как будет выглядеть получившийся клиент:

Дополнительная информация по команде zenity:

zenity --help
man zenity

Программа 5: Команда kdialog

Команда kdialog напоминает предыдущую программу zenity, но для KDE и приложений qt. С ее помощью вы можете создавать диалоговые окна. Например, если ввести в командную строку:

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

То получите такое окно:

Для знакомства с командой kdialog читайте руководство "Shell Scripting with KDE Dialogs".

Программа 6: Dialog

Dialog ≈ это приложение, которое включается в скрипты Bash и создает виджеты в текстовом интерфейсе. Использует библиотеки curses или 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

Подробности в man dialog.

О других программах создания виджетов

  • gmessage - GTK-клон программы xmessage;
  • xmessage - выводит сообщение или запрос в окне (графический аналог команды /bin/echo);
  • whiptail - создает диалоговые окна из скриптов;
  • python-dialog - модуль на Python для создания несложных текстовых интерфейсов.

Программа 7: Команда logger

Команда logger записывает информацию в системные логи, такие как /var/log/messages. Это дает возможность видоизменять логи из командной строки, например:

logger "MySQL database backup failed."
tail -f /var/log/messages
logger -t mysqld -p daemon.error "Database Server failed"
tail -f /var/log/syslog

Вот что получится:

Apr 20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed normal
Apr 20 00:12:20 vivek-desktop mysqld: Database Server failed
Для получения дополнительной информации смотрите howto "Write message to a syslog / log file" или читайте
man logger

Программа 8: Команда setterm

Команда setterm позволяет управлять окном терминала. Вот, например, как заставить терминал стать черным через 15 минут, а через 60 минут отключиться:

setterm -blank 15 -powersave powerdown -powerdown 60

А в этом примере продемонстрирован подчеркнутый текст в окне терминала:

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

Есть возможность включать и отключать курсор:

setterm -cursor off
setterm -cursor on

Детали в мане setterm.

Программа 9: smbclient: Отправка сообщений на рабочую станцию MS-Windows

Команда smbclient умеет общаться с серверами SMB/CIFS. Она способна дать сообщение как отдельным, так и всем пользователям сразу:

smbclient -M WinXPPro <<EOF
Message 1
Message 2
...
..
EOF

Или

 
echo "${Message}" | smbclient -M пользователь2
 

Подробности в нашей статье "Sending a message to Windows Workstation" или в

man smbclient

10: создание сетевых сокетов Bash

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

  1. /dev/tcp/host/port - если host означает существующее имя хоста или адрес Интернет, а порт - целочисленный номер порта, или имя сервиса, то bash попытается установить связь по протоколу TCP с соответствующим сокетом.
  2. /dev/udp/host/port - если host означает существующее имя хоста или адрес Интернет, а порт - целочисленный номер порта, или имя сервиса, то bash попытается установить связь по протоколу UDP с соответствующим сокетом.

Эту технологию можно использовать для определения, открыт ли нужный порт на локальном или удаленном сервере, не прибегая к nmap или другим сканерам портов.

# find out if TCP port 25 open or not
(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

Выводом будет что-то вроде:

Scanning TCP ports...
22 open
53 open
80 open
139 open
445 open
631 open

Подробнее об этом здесь.

Также можно использовать скрипт как клиент 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 <&3
do
   # do something on $LINE
   # or send $LINE to grep or awk for grabbing data
   # or simply display back data with echo command
   echo $LINE
done

Подробности в man bash.

GUI скрипты и Cronjob

Если для запуска скриптов вы используете cronjob, то должны согласовать локальный display/input сервис при помощи команды:

export DISPLAY=[user's machine]:0

Например, для вызова каждый час скрипта /home/vivek/scripts/monitor.stock.sh, использующего команду zenity, введите:

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


А у вас есть любимые GUI скрипты? Напишите нам в комментарии.

Средняя оценка 5 при 3 голосовавших