当前位置: 首页 > 科技观察

为UNIX-LinuxShell脚本编写增添趣味的10个工具

时间:2023-03-13 14:15:12 科技观察

有一种误解认为Shell脚本仅适用于CLI环境。事实上,在KDE或Gnome桌面下,您可以有效地使用各种工具来编写GUI或网络(套接字)脚本。Shell脚本可以使用一些GUI组件(菜单、警告框、进度条等),你可以控制终端输出、光标位置、各种输出效果等等。使用以下工具,您可以构建健壮、交互式且用户友好的UNIX/Linuxbash脚本。制作GUI应用程序并不是一件难事,但需要时间和耐心。幸运的是,UNIX和Linux都带有大量用于编写漂亮的GUI脚本的工具。以下工具在FreeBSD和Linux操作系统上进行了测试,应该也可以在其他类UNIX操作系统上运行。1.notify-send命令notify-send命令允许您在通知守护程序的帮助下向用户发送桌面通知。这种不打扰用户的方式对于通知桌面用户事件或显示某些信息很有用。在Debian或Ubuntu上,您需要使用apt命令或apt-get命令安装软件包:sudoapt-getinstalllibnotify-binCentOS/RHEL用户使用以下yum命令:sudoyuminstalllibnotifyFedoraLinux用户使用以下dnf命令:`$sudodnfinstalllibnotify`在本例中,从命令行发送简单的桌面通知,输入:###notify-send"rsnapshotdone:)"示例输出:notify-send:ShellScriptGetOrSendDesktopNotifications这是另一个附加选项的代码:...alert=18000live=$(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“BSESensex触及18k”;通知计数器=1;}...示例输出:Linux/UNIX:显示来自您的Shell脚本的通知此处使用通知发送:-t5000:以毫秒为单位指定超时(5000毫秒=5秒)-u低:设置紧急级别(例如:low,normal,urgent)-igtk-dialog-info:设置要显示的图标名称或指定的图标(可以设置路径为:-i/path/to/your-icon.png)更多信息使用通知发送功能,请参考手册页。在命令行输入mannotify-send可以看到:mannotify-send2,tput命令tput命令用于设置终端特性。使用tput您可以设置:在屏幕上移动光标。获取终端信息。设置颜色(背景和前景)。设置粗体模式。设置反转模式等。这是一个示例代码:#!/bin/bash#clearthescreenputclear#MovecursortoscreenlocationX,Y(topleftis0,0)tputcup315#SetaforegroundcolorusingANSIescapeputsetaf3echo"XYXCorpLTD."tputsgr0tputcup517#Setreversevideomodetputrevecho"MAIN-MENU"tputsgr0tputcup715echo"1.用户管理"tputcup815echo"2.服务管理"tputcup915echo"3.流程管理"tputcup1015echo"4.Backup"#setboldmodetputboldtputcup1215read-p"Enteryourchoice[1-4]"choicecleartputsgr0tputrc示例输出:Linux/UNIXScriptColorsandCursorMovementWithtput关于tput命令详见手册:man5terminfomantput3,setleds命令setleds命令可以设置键盘灯。下面是打开数字键灯的例子:setleds-D+num关闭数字键灯,输入:setleds-D-num-caps:关闭capslock灯+caps:打开capslocklight-scroll:关闭滚动锁light+scroll:打开滚动锁灯查看setleds手册获取更多信息和选项mansetleds。4.zenity命令zenity命令显示GTK+对话框并返回用户输入。它允许您使用各种shell脚本向用户显示或请求信息。以下是whois指定域名目录服务的GUI客户端示例。#!/bin/bash#获取域名_zenity="/usr/bin/zenity"_out="/tmp/whois.output.$$"domain=$(${_zenity}--title"输入域"\--entry--text"输入你想查看whois信息的域名")if[$?-eq0]then#在搜索whois数据库时显示进度对话框whois$domain|tee>(${_zenity}--width=200--height=100\--title="whois"--progress\--pulsate--text="正在搜索域信息..."\--auto-kill--auto-close\--percentage=10)>${_out}#显示返回输出${_zenity}--width=800--height=600\--title"Whoisinfofor$domain"\--text-info--filename="${_out}"else${_zenity}--error\--text="Noinputprovided"fi显示示例输出:zenity:Linux/UNIXdisplayDialogsBoxesFromTheShellScripts有关zenity和其他GTK+组件的更多信息,请参阅手册:zenity--helpmanzenity5,kdialog命令kdialog命令类似于zenity,但它是为KDE桌面和QT应用程序设计的。您可以使用kdialog来显示对话框。以下示例将在屏幕上显示一条消息:kdialog--dontagainmyscript:nofilemsg--msgbox"File:'~/.backup/config'notfound."示例输出:Kdialog:禁止显示对话框请参阅《KDE 对话框 Shell 脚本编程》教程获取更多信息。6.DialogDialog是一个使用Shell脚本来显示用户界面组件文本的应用程序。它使用curses或ncurses库。这是一个示例代码:#!/bin/bashdialog--title"删除文件"\--backtitle"LinuxShell脚本教程示例"\--yesno"你确定要永久删除吗\"/tmp/foo.TXT\”?”760#获取退出状态#0表示用户点击[yes]按钮。#1表示用户点击[no]按钮。#255表示用户点击[Esc]key.response=$?case$responsein0)echo"Filedeleted”;;1)echo"文件未删除。";;255)回声“按下[ESC]键。”;;esac详见dialog手册:mandialog。其他用户界面工具注意事项UNIX、Linux提供了大量其他工具来从命令行显示和控制应用程序,shell脚本可以使用一些KDE、Gnome、X组件集:gmessage-clonebasedonGTKxmessagexmessage-inShow或在窗口中询问消息(基于X的/bin/echo)whiptail-显示来自shell脚本的对话框python-dialog-用于制作简单文本或控制台模式用户界面的Python模块写入系统日志文件,例如:/var/日志/消息。它为系统日志模块syslog:logger"MySQLdatabasebackupfailed"提供了一个shell命令行界面。tail-f/var/log/messageslogger-tmysqld-pdaemon.error“数据库服务器失败”tail-f/var/日志/系统日志输出示例:4月20日00:11:45vivek-desktop内核:[38600.515354]CPU0:温度/速度正常4月20日00:12:20vivek-desktopmysqld:数据库服务器失败有关更多信息,请参阅《如何写消息到 syslog 或 日志文件》。另外也可以查看logger手册了解详情:manlogger8,setterm命令setterm命令可以设置不同的终端属性。下面的示例代码强制屏幕在15分钟后变黑,并在60分钟后强制显示器进入待机状态。setterm-blank15-powersavepowerdown-powerdown60以下示例在xterm窗口中为文本加下划线:setterm-cursoroff打开光标:setterm-cursoron详情参见setterm命令手册:mansetterm9,smbclient:向MS-Windows工作站发送消息smbclient命令可以与SMB/CIFS服务器通信。它可以向MS-Windows系统上的选定用户或所有用户发送消息。smbclient-MWinXPPro</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示例输出:扫描TCP端口...22open53open80open139open445open631open在下面的示例中,您的bash脚本将作为HTTP客户端:#!/bin/bashexec3<>/dev/tcp/${1:-www.cyberciti.biz}/80printf"GET/HTTP/1.0\r\n">&3printf"Accept:text/html,text/plain\r\n">&3printf"Accept-Language:en\r\n">&3printf"User-Agent:nixCraft_BashScriptv.%s\r\n""${BASH_VERSION}">&3printf"\r\n">&3whilereadLINE<&3do#dosomethingon$LINE#orsend$LINEtogreporawkforgrabbingdata#或者简单地显示回数据withecho命令echo$LINEdone更多信息请参见bash手册:manbash关于GUI工具和cron作业的注释显示或输出服务例如,使用zenity工具调用/home/vivek/scripts/monitor.stock.sh:@每小时DISPLAY=:0.0/home/vivek/scripts/monitor.stock.sh