10 个工具为您的 UNIX/Linux Shell 脚本增添趣味
有一些误解认为 shell 脚本仅适用于 CLI 环境。您可以高效地使用各种工具在 KDE 或 Gnome 桌面下编写 GUI 和网络(套接字)脚本。Shell 脚本可以利用一些 GUI 小部件(菜单、警告框、进度条等)。您始终可以控制最终输出、屏幕上的光标位置、各种输出效果等。使用以下工具,您可以构建功能强大、交互性强、用户友好的 UNIX/Linux bash shell 脚本。
创建 GUI 应用程序不是一项昂贵的任务,但需要时间和耐心。幸运的是,UNIX 和 Linux 都附带了大量工具来编写漂亮的 GUI 脚本。以下工具已在 FreeBSD 和 Linux 操作系统上进行了测试,但应该可以在其他类似 UNIX 的操作系统下运行。
1.notify-send 命令
使用notify-send命令,您可以通过命令行中的通知守护程序向用户发送桌面通知。这对于通知桌面用户有关事件或显示某种形式的信息而不会妨碍用户非常有用。您需要使用apt命令/ apt-get命令在Debian / Ubuntu Linux上安装以下软件包:
$ sudo apt-get install libnotify-bin
CentOS / RHEL用户尝试以下yum命令:
$ sudo yum install libnotify
Fedora Linux用户输入以下dnf命令:
$ sudo dnf install libnotify
在此示例中,从命令行发送简单的桌面通知,输入:
## send some notification ## notify-send "rsnapshot done :)"
示例输出:
图 01:notify-send 实际运行
.... 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; } ...
示例输出:
图 02:带有超时和其他选项的通知发送
- -t 5000:指定超时时间(以毫秒为单位)(5000 毫秒 = 5 秒)
- -u low:设置紧急程度(即低,正常或严重)。
- -i gtk-dialog-info:设置要显示的图标文件名或库存图标(您可以将路径设置为 -i /path/to/your-icon.png)。
有关使用通知发送实用程序的更多信息,请参阅通知发送手册页,可通过在命令行中输入 man 通知发送来查看:
man notify-send
#2: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
示例输出:
图 03:tput 实际运行
man 5 terminfo
man tput
#3:setleds 命令
setleds 命令允许您设置键盘 led。在此示例中,将 NumLock 设置为开启:
setleds -D +num
要关闭 NumLock,请输入:
setleds -D -num
- -caps:清除 CapsLock。
- +caps :设置 CapsLock。
- -scroll:清除ScrollLock。
- +scroll :设置ScrollLock。
有关更多信息和选项,请参阅 setleds 命令手册页:
man setleds
#4:zenity 命令
zenity 命令将显示 GTK+ 对话框并返回用户输入。这允许您通过各种 shell 脚本显示信息并向用户索取信息。以下是针对给定域名的 whois 目录服务的示例 GUI 客户端:
#!/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
示例输出:
图 4:zenity 的实际应用
zenity --help
man zenity
#5:kdialog 命令
kdialog 与 zenity 类似,但它是为 KDE 桌面/qt 应用程序设计的。您可以使用 kdialog 显示对话框。以下将在屏幕上显示消息:
kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."
示例输出:
图 05:抑制对话框的显示
请参阅使用 KDE 对话框的 shell 脚本教程以了解更多信息。
#6:对话
Dialog 是 shell 脚本中使用的应用程序,用于显示文本用户界面小部件。它使用 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
关于其他用户界面小部件工具的说明
UNIX 和 Linux 附带许多其他工具来从命令行显示和控制应用程序,并且 shell 脚本可以使用一些 KDE / Gnome / X 小部件集:
- gmessage — 基于 GTK 的 xmessage 克隆。
- xmessage – 在窗口中显示消息或查询(基于 X 的 /bin/echo)
- whiptail – 显示 shell 脚本的对话框
- python-dialog – 用于制作简单的文本/控制台模式用户界面的 Python 模块
#7:logger 命令
logger 命令将条目写入系统日志文件(例如 /var/log/messages)。它为 syslog 系统日志模块提供了 shell 命令接口:
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
请参阅如何将消息写入 syslog/日志文件以了解更多信息。或者,您可以查看 logger 手册页以了解详细信息:
man logger
#8: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
有关详细信息,请参阅 setterm 命令手册页:
man setterm
#9:smbclient:向 MS-Windows 工作站发送消息
smbclient 命令可以与 SMB/CIFS 服务器通信。它可以向 MS-Windows 系统上的选定用户或所有用户发送消息:
smbclient -M WinXPPro <<eof Message 1 Message 2 ... .. EOF
或者
echo "${Message}" | smbclient -M salesguy2
请参阅 smbclient 手册页或阅读我们之前关于使用 smbclient 命令“向 Windows 工作站发送消息”的帖子:
man smbclient
#10:Bash 套接字编程
在 bash 下,您可以打开套接字并通过它传递一些数据。您不必使用 curl 或 lynx 命令来从远程服务器获取数据。Bash 附带两个特殊的设备文件,可用于打开网络套接字。摘自 bash 手册页:
- /dev/tcp/host/port – 如果 host 是有效的主机名或 Internet 地址,并且 port 是整数端口号或服务名称,则 bash 将尝试打开与相应套接字的 TCP 连接。
- /dev/udp/host/port – 如果 host 是有效的主机名或 Internet 地址,并且 port 是整数端口号或服务名称,则 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"
您可以使用bash 循环并使用以下代码片段找出开放的端口:
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
在此示例中,您的 bash 脚本充当 HTTP 客户端:
#!/bin/bash exec 3<> /dev/tcp/${1:-www.example.com}/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: example_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
请参阅 bash 手册页以了解更多信息:
man bash
关于 GUI 工具和 Cronjob 的说明
如果您使用 cronjob调用脚本,则需要使用 export DISPLAY=[用户的机器]:0 命令请求本地显示/输入服务。例如,使用 zenity 工具调用 /home/vivek/scripts/monitor.stock.sh,如下所示:
@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh
有最喜欢的 UNIX 工具来为 shell 脚本增添趣味吗?请在下方评论中分享。