10 個增加 UNIX/Linux Shell 腳本趣味的工具

Linux愛好者2018-04-13 10:29:56

(點擊上方公眾號,可快速關注)


英文:Vivek Gite,翻譯:Linux中國/pygmalion666

linux.cn/article-9510-1.html


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


sudo apt-get install libnotify-bin


CentOS/RHEL 用戶使用下面的 yum 命令:


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 :)"


示例輸出:


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; }

...


示例輸出:


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


示例輸出:


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


示例輸出:


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."


示例輸出:


Kdialog: Suppressing the display of a dialog



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


可以查看 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 手冊:man smbclient


10、Bash 套接字編程


在 bash 下,你可以打開一個套接字並通過它發送數據。你不必使用 curl 或者 lynx 命令抓取遠程服務器的數據。bash 和兩個特殊的設備文件可用於打開網絡套接字。以下選自 bash 手冊:


  1. /dev/tcp/host/port - 如果 host 是一個有效的主機名或者網絡地址,而且端口是一個整數或者服務名,bash 會嘗試打開一個相應的 TCP 連接套接字。

  2. /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.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


參見 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+ 上面關注他。



看完本文有收穫?請分享給更多人

關注「Linux 愛好者」,提升Linux技能

淘口令複製以下紅色內容,再打開手淘即可購買

範品社,使用¥極客T恤¥搶先預覽(長按複製整段文案,打開手機淘寶即可進入活動內容)

閱讀原文

TAGS: