歡迎光臨
每天分享高質量文章

10 個增加 UNIX/Linux Shell 指令碼趣味的工具 | Linux 中國

shell 指令碼可以使用一些 GUI 元件(選單、警告框、進度條等),你可以控制終端輸出、游標位置以及各種輸出效果等等。利用下麵的工具,你可以構建強壯的、可互動的、對使用者友好的 UNIX/Linux bash 指令碼。
— Vivek Gite


致謝
編譯自 | https://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html 
 作者 | Vivek Gite
 譯者 | Andy Luo (pygmalion666) ? 共計翻譯:1 篇 貢獻時間:8 天

有些誤解認為 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 命令[1] 或 apt-get 命令[2] 安裝的包:

  1. sudo apt-get install libnotify-bin

CentOS/RHEL 使用者使用下麵的 yum 命令[3]

  1. sudo yum install libnotify

Fedora Linux 使用者使用下麵的 dnf 命令:

  1. `$ sudo dnf install libnotify`

  2. In this example, send simple desktop notification from the command line, enter:

  3. ### 傳送一些通知 ###

  4. notify-send "rsnapshot done :)"

示例輸出:

notify-send: Shell Script Get Or Send Desktop Notifications

下麵是另一個附加選項的程式碼:

  1. ...

  2. alert=18000

  3. live=$(lynx --dump http://money.rediff.com/ | grep 'BSE LIVE' | awk '{ print $5}' | sed 's/,//g;s/\.[0-9]*//g')

  4. [ $notify_counter -eq 0 ] && [ $live -ge $alert ] && { notify-send -t 5000 -u low -i   "BSE Sensex touched 18k";  notify_counter=1; }

  5. ...

示例輸出:

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 即可看見:

  1. man notify-send

2、tput 命令

tput 命令用於設定終端特性。透過 tput 你可以設定:

◈ 在螢幕上移動游標。
◈ 獲取終端資訊。
◈ 設定顏色(背景和前景)。
◈ 設定加粗樣式。
◈ 設定反轉樣式等等。

下麵有一段示例程式碼:

  1. #!/bin/bash

  2. # clear the screen

  3. tput clear

  4. # Move cursor to screen location X,Y (top left is 0,0)

  5. tput cup 3 15

  6. # Set a foreground colour using ANSI escape

  7. tput setaf 3

  8. echo "XYX Corp LTD."

  9. tput sgr0

  10. tput cup 5 17

  11. # Set reverse video mode

  12. tput rev

  13. echo "M A I N - M E N U"

  14. tput sgr0

  15. tput cup 7 15

  16. echo "1. User Management"

  17. tput cup 8 15

  18. echo "2. Service Management"

  19. tput cup 9 15

  20. echo "3. Process Management"

  21. tput cup 10 15

  22. echo "4. Backup"

  23. # Set bold mode

  24. tput bold

  25. tput cup 12 15

  26. read -p "Enter your choice [1-4] " choice

  27. tput clear

  28. tput sgr0

  29. tput rc

示例輸出:

Linux / UNIX Script Colours and Cursor Movement With tput

關於 tput 命令的詳細資訊,參見手冊:

  1. man 5 terminfo

  2. man tput

3、setleds 命令

setleds 命令允許你設定鍵盤燈。下麵是開啟數字鍵燈的示例:

  1. setleds -D +num

關閉數字鍵燈,輸入:

  1. setleds -D -num

◈ -caps:關閉大小寫鎖定燈
◈ +caps:開啟大小寫鎖定燈
◈ -scroll:關閉滾動鎖定燈
◈ +scroll:開啟滾動鎖定燈

檢視 setleds 手冊可看見更多資訊和選項 man setleds

4、zenity 命令

zenity 命令顯示 GTK+ 對話方塊[4],並且傳回用戶輸入。它允許你使用各種 Shell 指令碼向用戶展示或請求資訊。下麵是一個 whois 指定域名目錄服務的 GUI 客戶端示例。

  1. #!/bin/bash

  2. # Get domain name

  3. _zenity="/usr/bin/zenity"

  4. _out="/tmp/whois.output.$$"

  5. domain=$(${_zenity} --title  "Enter domain" \

  6.             --entry --text "Enter the domain you would like to see whois info" )

  7. if [ $? -eq 0 ]

  8. then

  9.  # Display a progress dialog while searching whois database

  10.  whois $domain  | tee >(${_zenity} --width=200 --height=100 \

  11.                    --title="whois" --progress \

  12.                        --pulsate --text="Searching domain info..." \

  13.                                    --auto-kill --auto-close \

  14.                                    --percentage=10) >${_out}

  15.  # Display back output

  16.  ${_zenity} --width=800 --height=600  \

  17.         --title "Whois info for $domain" \

  18.         --text-info --filename="${_out}"

  19. else

  20.  ${_zenity} --error \

  21.         --text="No input provided"

  22. fi

示例輸出:

zenity: Linux / UNIX display Dialogs Boxes From The Shell Scripts

參見手冊獲取更多 zenity 資訊以及其他支援 GTK+ 的元件:

  1. zenity --help

  2. man zenity

5、kdialog 命令

kdialog 命令與 zenity 類似,但它是為 KDE 桌面和 QT 應用設計。你可以使用 kdialog 展示對話方塊。下麵示例將在螢幕上顯示資訊:

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

示例輸出:

Kdialog: Suppressing the display of a dialog

參見 《KDE 對話方塊 Shell 指令碼程式設計[5]》 教程獲取更多資訊。

6、Dialog

Dialog 是一個使用 Shell 指令碼的應用[6],顯示使用者介面元件的文字。它使用 curses 或者 ncurses 庫。下麵是一個示例程式碼:

  1. #!/bin/bash

  2. dialog --title "Delete file" \

  3. --backtitle "Linux Shell Script Tutorial Example" \

  4. --yesno "Are you sure you want to permanently delete \"/tmp/foo.txt\"?" 7 60

  5. # Get exit status

  6. # 0 means user hit [yes] button.

  7. # 1 means user hit [no] button.

  8. # 255 means user hit [Esc] key.

  9. response=$?

  10. case $response in

  11.   0) echo "File deleted.";;

  12.   1) echo "File not deleted.";;

  13.   255) echo "[ESC] key pressed.";;

  14. 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 命令列介面:

  1. logger "MySQL database backup failed."

  2. tail -f /var/log/messages

  3. logger -t mysqld -p daemon.error "Database Server failed"

  4. tail -f /var/log/syslog

示例輸出:

  1. Apr 20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed normal

  2. Apr 20 00:12:20 vivek-desktop mysqld: Database Server failed

參見 《如何寫訊息到 syslog 或 日誌檔案[7]》 獲得更多資訊。此外,你也可以檢視 logger 手冊獲取詳細資訊:man logger

8、setterm 命令

setterm 命令可設定不同的終端屬性。下麵的示例程式碼會強制螢幕在 15 分鐘後變黑,監視器則 60 分鐘後待機。

  1. setterm -blank 15 -powersave powerdown -powerdown 60

下麵的例子將 xterm 視窗中的文字以下劃線展示:

  1. setterm -underline on;

  2. echo "Add Your Important Message Here"

  3. setterm -underline off

另一個有用的選項是開啟或關閉游標顯示:

  1. setterm -cursor off

開啟游標:

  1. setterm -cursor on

參見 setterm 命令手冊獲取詳細資訊:man setterm

9、smbclient:給 MS-Windows 工作站傳送訊息

smbclient 命令可以與 SMB/CIFS 伺服器通訊。它可以向 MS-Windows 系統上選定或全部使用者傳送訊息。

  1. smbclient -M WinXPPro <<eof

  2. Message 1

  3. Message 2

  4. ...

  5. ..

  6. EOF

  1. echo "${Message}" | smbclient -M salesguy2

參見 smbclient 手冊或者閱讀我們之前釋出的文章:《給 Windows 工作站傳送訊息[8]》:man smbclient

10、Bash 套接字程式設計

在 bash 下,你可以開啟一個套接字並透過它傳送資料。你不必使用 curl 或者 lynx 命令抓取遠端伺服器的資料。bash 和兩個特殊的裝置檔案可用於開啟網路套接字。以下選自 bash 手冊:

☉ /dev/tcp/host/port - 如果 host 是一個有效的主機名或者網路地址,而且埠是一個整數或者服務名,bash 會嘗試開啟一個相應的 TCP 連線套接字。
☉ /dev/udp/host/port - 如果 host 是一個有效的主機名或者網路地址,而且埠是一個整數或者服務名,bash 會嘗試開啟一個相應的 UDP 連線套接字。

你可以使用這項技術來確定本地或遠端伺服器埠是開啟或者關閉狀態,而無需使用 nmap 或者其它的埠掃描器。

  1. # find out if TCP port 25 open or not

  2. (echo >/dev/tcp/localhost/25) &>/dev/null && echo "TCP port 25 open" || echo "TCP port 25 close"

下麵的程式碼片段,你可以利用 bash 迴圈找出已開啟的埠[9]

  1. echo "Scanning TCP ports..."

  2. for p in {1..1023}

  3. do

  4.  (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open"

  5. done

示例輸出:

  1. Scanning TCP ports...

  2. 22 open

  3. 53 open

  4. 80 open

  5. 139 open

  6. 445 open

  7. 631 open

下麵的示例中,你的 bash 指令碼將像 HTTP 客戶端一樣工作:

  1. #!/bin/bash

  2. exec 3<> /dev/tcp/${1:-www.cyberciti.biz}/80

  3. printf "GET / HTTP/1.0\r\n" >&3

  4. printf "Accept: text/html, text/plain\r\n" >&3

  5. printf "Accept-Language: en\r\n" >&3

  6. printf "User-Agent: nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}"   >&3

  7. printf "\r\n" >&3

  8. while read LINE 3

  9. do

  10.   # do something on $LINE

  11.   # or send $LINE to grep or awk for grabbing data

  12.   # or simply display back data with echo command

  13.   echo $LINE

  14. done

參見 bash 手冊獲取更多資訊:man bash

關於 GUI 工具和 cron 任務的註意事項

如果你 使用 crontab[10] 來啟動你的指令碼,你需要使用 export DISPLAY=[使用者機器]:0 命令請求本地顯示或輸出服務。舉個例子,使用 zenity 工具呼叫 /home/vivek/scripts/monitor.stock.sh

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

你有喜歡的可以增加 shell 指令碼趣味的 UNIX 工具麼?請在下麵的評論區分享它吧。

關於作者

本文作者是 nixCraft 創始人、一個老練的系統管理員、Linux 作業系統和 UNIX shell 程式設計培訓師。他服務來自全球的客戶和不同的行業,包括 IT 、教育、防務和空間探索、還有非營利組織。你可以在 Twitter[11]Facebook[12]Google+[13] 上面關註他。


via: https://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html

作者:Vivek Gite[15] 譯者:pygmalion666 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂

© 2024 知識星球   網站地圖