10个工具让你的 shell 脚本更强大

很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。 

1. notify-send 命令

这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包: 

$ sudo apt-get install libnotify-bin

下面这个例子展示了如何从命令行向桌面发送一个简单的消息: 

notify-send "rsnapshot done :)" 

输出: 
 

下面是一个复杂一点的例子: 

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

输出: 
 

这里的参数解释如下: 

  •  -t 5000:指定超时的时间,毫秒
  •  -u low:设置是否紧急
  •  -i gtk-dialog-info:通知图标,你可以指定图标 -i /path/to/your-icon.png

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

输出: 
 

3. setleds 命令 

这个命令可以让你控制键盘灯,例如打开数字键盘灯: 

setleds -D +num

关闭数字键盘灯: 

setleds -D -num
  •   -caps: 清除大写灯
  •   +caps:打开大写灯
  •   -scroll:清除滚动锁
  •   +scroll:打开滚动锁

4. zenity 命令

这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询: 

#!/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

5. kdialog 命令 

这个命令和zenity很想,只不过它是为KDE/QT应用准备的。使用方法如下: 

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

输出 
 

你可以查看 shell scription with KDE Dialogs 来获取更多信息 

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

 

7. logger 命令 

这个命令可以让你写入系统日志例如 /var/log/messages: 

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 

8. setterm 命令 

这个命令可以设置中断的属性。下面的例子是强制屏幕全黑15分钟,并且60分钟后把显示器设为待机状态: 

setterm -blank 15 -powersave powerdown -powerdown 60

下面这段命令可以在中断显示加下划线的文字: 

setterm -underline on;
echo "Add Your Important Message Here"
setterm -underline off

或者你可以关闭光标: 

setterm -cursor off

9. smbclient:

向 MS-Windows 系统发送消息 
smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息: 

smbclient -M WinXPPro <

或者 

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

10. Bash Socket 编程 

你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件: 

  •   /dev/tcp/host/port - 如果hostname,和port是合法的话,bash会尝试开启一个TCP连接。
  •   /dev/udp/host/port - 如果hostname和port是合法的话,bash会开启一个UDP连接。

  
你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器: 

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

你可以 使用循环来查找开着的端口: 

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 

下面的这个例子让你的脚本扮演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

关于GUITools和Cronjob 

如果你使用cronjob来调用你的脚本的话,你要通过“ export DISPLAY=[user's machine]:0 ”命令来设置本地的 display/input 服务。例如调用 /home/vivek/scripts/monitor.stock.sh脚本,它使用了 zenity 工具: 

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

所有的命令你都可以通过“man”来查询详细的使用方式。 

 原文发布时间为:2013-04-05

本文来自合作伙伴“Linux中国”

时间: 2024-11-05 14:59:48

10个工具让你的 shell 脚本更强大的相关文章

Linux Shell脚本之更新hosts文件以便于访问谷歌服务

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1765282   Linux服务器一般不带图形界面,管理员通常都是通过命令行界面直接操作服务器.在日常的管理运维中,经常需要用到github.gist.githubusercontent等网站上的一些内容,也有时需要用到Google上的一些服务,如Google API之类的.然而这些网站大部分都被GFW防火长城屏蔽掉

读取配置文件的shell脚本实现

(本人正在参加2015博客之星评选,诚邀你来投票,谢谢:http://vote.blog.csdn.net/blogstar2015/candidate?username=zhouzxi) 最近,在从事开发工作的过程中,遇到了一个需求:用shell脚本实现对配置文件的读取,并将读取到的配置项写入到新的文件中. 为了完成该需求,我们考虑使用awk命令,该命令把文件中的内容逐行的读入,按照特定的规则对每行记录进行处理. 例如,我们要从文件Config.ini(位于当前用户的etc目录下)中获取各个配

通过shell脚本查看procedure的信息

在一个schema中,可能含有大量的procedure, 有时候想查看具体的信息,一般得通过toad,plsql dev等工具来查看,有时候在尽可能摆脱图形工具的前提下,想能够尽快的查找一些信息,还是使用shell脚本更快,更准,更直接. 可以使用如下的shell脚本来查找procedure的信息. 以下的脚本可以查找是否有需要的prcedure信息. PROC_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID set pagesize 40 feed

Shell脚本生成网页版相册浏览器

今天学到了一招,那就是使用脚本制作一款网页版相册浏览器.先上图吧. 必备基础 操作系统: 以linux为内核的操作系统都行 编程语言:Shell(bash)脚本,相关基础知识即可 下载工具:wget 图片处理工具: ImageMagicK, 解压缩工具 : rar ,bzip都行 额外技能:一些基本的Linux操作命令,如此即可. 软件安装 这里说的软件安装主要是指解压缩工具和图片下载工具的使用.因为我的linux是在虚拟机里,而且没有安装文件共享增强(如果安装了增强的话,就不必安装解压缩工具了

Shell脚本实现的基于SVN的代码提交量统计工具

  这篇文章主要介绍了Shell脚本实现的基于SVN的代码提交量统计工具,本文直接给出实现脚本代码,需要的朋友可以参考下 最近没啥事,就用bash写了一个基于svn的代码统计小工具. 可以指定统计的目录,默认递归统计子目录. 目前还没有屏蔽指定目录的功能.哈 代码比较粗糙.不过先晒出来. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 3

求救!求救ssh2 远程Shell脚本执行工具的问题

问题描述 最近在用ssh2远程Shell脚本执行工具写了一个代码测试执行普通的命令都可以比如"ls"啦什么的都可以但是执行动态的就不可以比如"top"也没有错误只是返回的是"".求大家帮忙呀!下面是代码main是测试用的是root的权限packagecom.syxp.sjyw.util;importjava.io.IOException;importjava.io.InputStream;importjava.nio.charset.Charse

shell脚本实现随机生成10个8位密码_linux shell

随机生成10个8位密码shell脚本 1.首位大写字母 2.中间六位大小写字母数字随机混合 3.第八位[0-9] #!/bin.bash for i in {1..10} do A=`head -c 500 /dev/urandom | tr -dc a-zA-Z | tr [a-z] [A-Z]|head -c 1` B=`head -c 500 /dev/urandom | tr -dc a-z0-9A-Z | head -c 6` C=`echo $RANDOM|cut -c 2` ech

使用shc工具加密shell脚本详解_linux shell

Shc可以用来对shell脚本进行加密,可以将shell脚本转换为一个可执行的二进制文件.经过shc对shell脚本进行加密后,会同时生成两种个新的文件,一个是加密后的可执行的二进制文件(文件名以.x结束),另一个是C语言的原文件(文件名以.x.c结束).   下面就说明一下shc的安装,参数,以及使用示例: 下载安装: (官网下载地址: http://www.datsi.fi.upm.es/~frosal/sources/) 复制代码 代码如下: # wget http://www.datsi

Linux Shell脚本的10个有用的“面试问题和解答”

Linux Shell脚本的10个有用的"面试问题和解答"首先致上每日问候.Linux的浩瀚无垠,使人总能每次都提交与众不同的内容.我们"The-Tecmint-Team"的工作是给我们的读者提供一些独特的内容,这些内容不仅对他们的职业生涯很有用,同时也让他们增长知识.在此,我们就尝试这么去做,至于能取得多大的成功,就由我们的读者朋友们来判断吧. Questions on Shell Scripting 我们为各类用户提供了关于Shell脚本语言和面试问题的很多教程