扣丁學堂Linux培訓之增加UNIX/Linux Shell腳本趣味的工具分享
有些誤解認為shell腳本僅用于CLI環境。實際上在KDE或Gnome桌面下,你可以有效的使用各種工具編寫GUI或者網絡(socket)腳本。shell腳本可以使用一些GUI組件(菜單、警告框、進度條等),你可以控制終端輸出、光標位置以及各種輸出效果等等。利用下面的工具,你可以構建強壯的、可交互的、對用戶友好的UNIX/Linuxbash腳本。

制作GUI應用不是一項困難的任務,但需要時間和耐心。幸運的是,UNIX和Linux都帶有大量編寫漂亮GUI腳本的工具。以下工具是基于FreeBSD和Linux操作系統做的測試,而且也適用于其他類UNIX操作系統。
1、notify-send命令
notify-send命令允許你借助通知守護進程發送桌面通知給用戶。這種避免打擾用戶的方式,對于通知桌面用戶一個事件或顯示一些信息是有用的。在Debian或Ubuntu上,你需要使用apt命令或apt-get命令安裝的包:
sudoapt-getinstalllibnotify-bin CentOS/RHEL用戶使用下面的yum命令: sudoyuminstalllibnotify FedoraLinux用戶使用下面的dnf命令: `$sudodnfinstalllibnotify` Inthisexample,sendsimpledesktopnotificationfromthecommandline,enter: ###發送一些通知### notify-send"rsnapshotdone:)"
示例輸出:

下面是另一個附加選項的代碼:
alert=18000
live=$(lynx--dumphttp://money.rediff.com/|grep'BSELIVE'|awk'{print$5}'|sed's/,//g;s/\.[0-9]*//g')
[$notify_counter-eq0]&&[$live-ge$alert]&&{notify-send-t5000-ulow-i"BSESensextouched18k";notify_counter=1;}示例輸出:

這里:
-t5000:指定超時時間(毫秒)(5000毫秒=5秒)
-ulow:設置緊急等級(如:低、普通、緊急)
-igtk-dialog-info:設置要顯示的圖標名稱或者指定的圖標(你可以設置路徑為:-i/path/to/your-icon.png)
mannotify-send
2、tput命令
tput命令用于設置終端特性。通過tput你可以設置:
在屏幕上移動光標。
獲取終端信息。
設置顏色(背景和前景)。
設置加粗模式。
設置反轉模式等等。
下面有一段示例代碼:
#!/bin/bash #clearthescreen tputclear #MovecursortoscreenlocationX,Y(topleftis0,0) tputcup315 #SetaforegroundcolourusingANSIescape tputsetaf3 echo"XYXCorpLTD." tputsgr0 tputcup517 #Setreversevideomode tputrev echo"MAIN-MENU" tputsgr0 tputcup715 echo"1.UserManagement" tputcup815 echo"2.ServiceManagement" tputcup915 echo"3.ProcessManagement" tputcup1015 echo"4.Backup" #Setboldmode tputbold tputcup1215 read-p"Enteryourchoice[1-4]"choice tputclear tputsgr0 tputrc
示例輸出:

3、setleds命令
setleds命令允許你設置鍵盤燈。下面是打開數字鍵燈的示例: setleds-D+num 關閉數字鍵燈,輸入: setleds-D-num -caps:關閉大小寫鎖定燈 +caps:打開大小寫鎖定燈 -scroll:關閉滾動鎖定燈 +scroll:打開滾動鎖定燈
4、zenity命令
zenity命令顯示GTK+對話框,并且返回用戶輸入。它允許你使用各種Shell腳本向用戶展示或請求信息。下面是一個whois指定域名目錄服務的GUI客戶端示例。
#!/bin/bash
#Getdomainname
_zenity="/usr/bin/zenity"
_out="/tmp/whois.output.$$"
domain=$(${_zenity}--title"Enterdomain"\
--entry--text"Enterthedomainyouwouldliketoseewhoisinfo")
if[$?-eq0]
then
#Displayaprogressdialogwhilesearchingwhoisdatabase
whois$domain|tee>(${_zenity}--width=200--height=100\
--title="whois"--progress\
--pulsate--text="Searchingdomaininfo..."\
--auto-kill--auto-close\
--percentage=10)>${_out}
#Displaybackoutput
${_zenity}--width=800--height=600\
--title"Whoisinfofor$domain"\
--text-info--filename="${_out}"
else
${_zenity}--error\
--text="Noinputprovided"
fi示例輸出:

5、kdialog命令
kdialog命令與zenity類似,但它是為KDE桌面和QT應用設計。你可以使用kdialog展示對話框。下面示例將在屏幕上顯示信息:
kdialog--dontagainmy:nofilemsg--msgbox"File:'~/.backup/config'notfound."
示例輸出:

6、Dialog
Dialog是一個使用Shell腳本的應用,顯示用戶界面組件的文本。它使用curses或者ncurses庫。下面是一個示例代碼:
#!/bin/bash dialog--title"Deletefile"\ --backtitle"LinuxShellTutorialExample"\ --yesno"Areyousureyouwanttopermanentlydelete\"/tmp/foo.txt\"?"760 #Getexitstatus #0meansuserhit[yes]button. #1meansuserhit[no]button. #255meansuserhit[Esc]key. response=$? case$responsein 0)echo"Filedeleted.";; 1)echo"Filenotdeleted.";; 255)echo"[ESC]keypressed.";; esac
關于其他用戶界面工具的注意事項
UNIX、Linux提供了大量其他工具來顯示和控制命令行中的應用程序,shell腳本可以使用一些KDE、Gnome、X組件集:
gmessage-基于GTKxmessage的克隆
xmessage-在窗口中顯示或詢問消息(基于X的/bin/echo)
whiptail-顯示來自shell腳本的對話框
python-dialog-用于制作簡單文本或控制臺模式用戶界面的Python模塊
7、logger命令
logger命令將信息寫到系統日志文件,如:/var/log/messages。它為系統日志模塊syslog提供了一個shell命令行接口:
logger"MySQLdatabasebackupfailed." tail-f/var/log/messages logger-tmysqld-pdaemon.error"DatabaseServerfailed" tail-f/var/log/syslog 示例輸出: Apr2000:11:45vivek-desktopkernel:[38600.515354]CPU0:Temperature/speednormal Apr2000:12:20vivek-desktopmysqld:DatabaseServerfailed
8、setterm命令
setterm命令可設置不同的終端屬性。下面的示例代碼會強制屏幕在15分鐘后變黑,監視器則60分鐘后待機。
setterm-blank15-powersavepowerdown-powerdown60 下面的例子將xterm窗口中的文本以下劃線展示: setterm-underlineon; echo"AddYourImportantMessageHere" setterm-underlineoff 另一個有用的選項是打開或關閉光標顯示: setterm-cursoroff 打開光標: setterm-cursoron
9、smbclient:給MS-Windows工作站發送消息
smbclient命令可以與SMB/CIFS服務器通訊。它可以向MS-Windows系統上選定或全部用戶發送消息。
smbclient-MWinXPPro<
Message1
Message2
...
..
EOF
或
echo"${Message}"|smbclient-Msalesguy2
10、Bash套接字編程
在bash下,你可以打開一個套接字并通過它發送數據。你不必使用curl或者lynx命令抓取遠程服務器的數據。bash和兩個特殊的設備文件可用于打開網絡套接字。以下選自bash手冊:
/dev/tcp/host/port-如果host是一個有效的主機名或者網絡地址,而且端口是一個整數或者服務名,bash會嘗試打開一個相應的TCP連接套接字。
/dev/udp/host/port-如果host是一個有效的主機名或者網絡地址,而且端口是一個整數或者服務名,bash會嘗試打開一個相應的UDP連接套接字。
你可以使用這項技術來確定本地或遠程服務器端口是打開或者關閉狀態,而無需使用nmap或者其它的端口掃描器。
#findoutifTCPport25openornot (echo>/dev/tcp/localhost/25)&>/dev/null&&echo"TCPport25open"||echo"TCPport25close"
下面的代碼片段,你可以利用bash循環找出已打開的端口:
echo"ScanningTCPports..."
forpin{1..1023}
do
(echo>/dev/tcp/localhost/$p)>/dev/null2>&1&&echo"$popen"
done
示例輸出:
ScanningTCPports...
22open
53open
80open
139open
445open
631open
下面的示例中,你的bash腳本將像HTTP客戶端一樣工作:
#!/bin/bash
exec3<>/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_Bashv.%s\r\n""${BASH_VERSION}">&3
printf"\r\n">&3
whilereadLINE<&3
do
#dosomethingon$LINE
#orsend$LINEtogreporawkforgrabbingdata
#orsimplydisplaybackdatawithechocommand
echo$LINE
done最后體系如果你使用crontab來啟動你的腳本,你需要使用exportDISPLAY=[用戶機器]:0命令請求本地顯示或輸出服務。想要了解更多關于Linux發展前景趨勢,請關注扣丁學堂Linux培訓官網、微信等平臺,扣丁學堂IT職業在線學習教育平臺為您提供權威的Linux視頻教程系統,通過千鋒扣丁學堂金牌講師在線錄制的Linux視頻教程課程,讓你快速掌握Linux從入門到精通開發實戰技能。扣丁學堂Linux技術交流群:692395686。微 信 號:codingbb
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。











