Библиотека сайта rus-linux.net
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
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:
- /dev/tcp/host/port - если host означает существующее имя хоста или адрес Интернет, а порт - целочисленный номер порта, или имя сервиса, то bash попытается установить связь по протоколу TCP с соответствующим сокетом.
- /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 скрипты? Напишите нам в комментарии.