10 個增加 UNIX/Linux Shell 腳本趣味的工具
有些誤解認為 shell 腳本僅用於 CLI 環境。實際上在 KDE 或 Gnome 桌面下,你可以有效的使用各種工具編寫 GUI 或者網路(socket)腳本。shell 腳本可以使用一些 GUI 組件(菜單、警告框、進度條等),你可以控制終端輸出、游標位置以及各種輸出效果等等。利用下面的工具,你可以構建強壯的、可交互的、對用戶友好的 UNIX/Linux bash 腳本。
製作 GUI 應用不是一項困難的任務,但需要時間和耐心。幸運的是,UNIX 和 Linux 都帶有大量編寫漂亮 GUI 腳本的工具。以下工具是基於 FreeBSD 和 Linux 操作系統做的測試,而且也適用於其他類 UNIX 操作系統。
1、notify-send 命令
notify-send
命令允許你藉助通知守護進程發送桌面通知給用戶。這種避免打擾用戶的方式,對於通知桌面用戶一個事件或顯示一些信息是有用的。在 Debian 或 Ubuntu 上,你需要使用 [apt 命令](https://www.cyberciti.biz/faq/ubuntu-lts-debian-linux-apt-command-examples/ "See Linux/Unix apt command examples for more info") 或 [apt-get 命令](https://www.cyberciti.biz/tips/linux-debian-package-management-cheat-sheet.html "See Linux/Unix apt-get command examples for more info") 安裝的包:
sudo apt-get install libnotify-bin
CentOS/RHEL 用戶使用下面的 [yum 命令](https://www.cyberciti.biz/faq/rhel-centos-fedora-linux-yum-command-howto/ "See Linux/Unix yum command examples for more info"):
sudo yum install libnotify
Fedora Linux 用戶使用下面的 dnf 命令:
`$ sudo dnf install libnotify`
In this example, send simple desktop notification from the command line, enter:
### 發送一些通知 ###
notify-send "rsnapshot done :)"
示例輸出:
![Fig:01: notify-send in action ](/data/attachment/album/201804/03/174831ng1nmfk28ughghvf.png "notify-send: Shell Script Get Or Send Desktop Notifications ")
下面是另一個附加選項的代碼:
...
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; }
...
示例輸出:
![Fig.02: notify-send with timeouts and other options](/data/attachment/album/201804/03/174832az4lbvex53lymes3.png "Linux / UNIX: Display Notifications From Your Shell Scripts With notify-send")
這裡:
-t 5000
:指定超時時間(毫秒) (5000 毫秒 = 5 秒)-u low
: 設置緊急等級 (如:低、普通、緊急)-i gtk-dialog-info
: 設置要顯示的圖標名稱或者指定的圖標(你可以設置路徑為:-i /path/to/your-icon.png
)
關於更多使用 notify-send
功能的信息,請參考 man 手冊。在命令行下輸入 man notify-send
即可看見:
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
示例輸出:
![Fig.03: tput in action](/data/attachment/album/201804/03/174832bz0t7fu2rthjjc22.png "Linux / UNIX Script Colours and Cursor Movement With tput")
關於 tput
命令的詳細信息,參見手冊:
man 5 terminfo
man tput
3、setleds 命令
setleds
命令允許你設置鍵盤燈。下面是打開數字鍵燈的示例:
setleds -D +num
關閉數字鍵燈,輸入:
setleds -D -num
-caps
:關閉大小寫鎖定燈+caps
:打開大小寫鎖定燈-scroll
:關閉滾動鎖定燈+scroll
:打開滾動鎖定燈
查看 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
示例輸出:
![Fig.04: zenity in Action](/data/attachment/album/201804/03/174832kyqetem3t9mcvqeh.png "zenity: Linux / UNIX display Dialogs Boxes From The Shell Scripts")
參見手冊獲取更多 zenity
信息以及其他支持 GTK+ 的組件:
zenity --help
man zenity
5、kdialog 命令
kdialog
命令與 zenity
類似,但它是為 KDE 桌面和 QT 應用設計。你可以使用 kdialog
展示對話框。下面示例將在屏幕上顯示信息:
kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."
示例輸出:
![Fig.05: Suppressing the display of a dialog ](/data/attachment/album/201804/03/174833kavn8w0ovk0a8g80.png "Kdialog: Suppressing the display of a dialog ")
參見 《KDE 對話框 Shell 腳本編程》 教程獲取更多信息。
6、Dialog
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
參見 dialog
手冊獲取詳細信息: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
手冊或者閱讀我們之前發布的文章:《給 Windows 工作站發送消息》:man smbclient
10、Bash 套接字編程
在 bash 下,你可以打開一個套接字並通過它發送數據。你不必使用 curl
或者 lynx
命令抓取遠程伺服器的數據。bash 和兩個特殊的設備文件可用於打開網路套接字。以下選自 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"
下面的代碼片段,你可以利用 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.cyberciti.biz}/80
printf "GET / HTTP/1.0rn" >&3
printf "Accept: text/html, text/plainrn" >&3
printf "Accept-Language: enrn" >&3
printf "User-Agent: nixCraft_BashScript v.%srn" "${BASH_VERSION}" >&3
printf "rn" >&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 工具和 cron 任務的注意事項
如果你 使用 crontab 來啟動你的腳本,你需要使用 export DISPLAY=[用戶機器]:0
命令請求本地顯示或輸出服務。舉個例子,使用 zenity
工具調用 /home/vivek/scripts/monitor.stock.sh
:
@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh
你有喜歡的可以增加 shell 腳本趣味的 UNIX 工具么?請在下面的評論區分享它吧。
關於作者
本文作者是 nixCraft 創始人、一個老練的系統管理員、Linux 操作系統和 UNIX shell 編程培訓師。他服務來自全球的客戶和不同的行業,包括 IT 、教育、防務和空間探索、還有非營利組織。你可以在 Twitter,Facebook,Google+ 上面關注他。
via: https://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html
作者:Vivek Gite 譯者:pygmalion666 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive