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."
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
Также, например, вы можете отключить отображение курсора на экране:
и затем включить его:
За подробностями по работе с программой — 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 <&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.
Замечание о заданиях cron и GUI-приложениях
Если вы планируете запускать ваши сценарии, написанные с использованием Zenity или ей подобными, не забывайте прежде определять значение переменной DISPLAY в строке описания задания файла crontab. Например:
@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh