10个工具让你的 shell 脚本更强大
2012-10-11 16:28
746 查看
很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。
1. notify-send 命令
这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包:
下面这个例子展示了如何从命令行向桌面发送一个简单的消息:
输出:
下面是一个复杂一点的例子:
输出:
这里的参数解释如下:
-t 5000:指定超时的时间,毫秒
-u low:设置是否紧急
-i gtk-dialog-info:通知图标,你可以指定图标 -i /path/to/your-icon.png
2. tput 命令
这个命令是用来设置终端特性的:
移动光标
获得终端信息
设置前景和背景色
设置粗体模式
设置反模式等等
举例:
输出:
3. setleds 命令
这个命令可以让你控制键盘灯,例如打开数字键盘灯:
关闭数字键盘灯:
-caps: 清除大写灯
+caps:打开大写灯
-scroll:清除滚动锁
+scroll:打开滚动锁
4. zenity 命令
这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询:
输出:
5. kdialog 命令
这个命令和zenity很想,只不过它是为KDE/QT应用准备的。使用方法如下:
输出
你可以查看 shell scription with KDE Dialogs 来获取更多信息
6. Dialog
这个命令可以在shell脚本中显示文本组件。它使用了curses和ncurses类库。示例代码:
7. logger 命令
这个命令可以让你写入系统日志例如 /var/log/messages:
输出:
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分钟后把显示器设为待机状态:
下面这段命令可以在中断显示加下划线的文字:
或者你可以关闭光标:
9. smbclient:向 MS-Windows 系统发送消息
smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息:
或者
10. Bash Socket 编程
你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件:
/dev/tcp/host/port - 如果hostname,和port是合法的话,bash会尝试开启一个TCP连接。
/dev/udp/host/port - 如果hostname和port是合法的话,bash会开启一个UDP连接。
你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器:
你可以 使用循环来查找开着的端口:
输出:
Scanning TCP ports...
22 open
53 open
80 open
139 open
445 open
631 open
下面的这个例子让你的脚本扮演HTTP客户端:
关于GUITools和Cronjob
如果你使用cronjob来调用你的脚本的话,你要通过“ export DISPLAY=[user's machine]:0”命令来设置本地的 display/input 服务。例如调用 /home/vivek/scripts/monitor.stock.sh脚本,它使用了 zenity 工具:
view source
print?
所有的命令你都可以通过“man”来查询详细的使用方式。
1. notify-send 命令
这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包:
1 | $ sudo apt-get install libnotify-bin |
1 | notify-send "rsnapshot done :)" |
下面是一个复杂一点的例子:
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 | ... |
这里的参数解释如下:
-t 5000:指定超时的时间,毫秒
-u low:设置是否紧急
-i gtk-dialog-info:通知图标,你可以指定图标 -i /path/to/your-icon.png
2. tput 命令
这个命令是用来设置终端特性的:
移动光标
获得终端信息
设置前景和背景色
设置粗体模式
设置反模式等等
举例:
01 | #!/bin/bash |
02 |
03 | # clear the screen |
04 | tput clear |
05 |
06 | # Move cursor to screen location X,Y (top left is 0,0) |
07 | tput cup 3 15 |
08 |
09 | # Set a foreground colour using ANSI escape |
10 | tput setaf 3 |
11 | echo "XYX Corp LTD." |
12 | tput sgr0 |
13 |
14 | tput cup 5 17 |
15 | # Set reverse video mode |
16 | tput rev |
17 | echo "M A I N - M E N U" |
18 | tput sgr0 |
19 |
20 | tput cup 7 15 |
21 | echo "1. User Management" |
22 |
23 | tput cup 8 15 |
24 | echo "2. Service Management" |
25 |
26 | tput cup 9 15 |
27 | echo "3. Process Management" |
28 |
29 | tput cup 10 15 |
30 | echo "4. Backup" |
31 |
32 | # Set bold mode |
33 | tput bold |
34 | tput cup 12 15 |
35 | read -p "Enter your choice [1-4] " choice |
36 |
37 | tput clear |
38 | tput sgr0 |
39 | tput rc |
3. setleds 命令
这个命令可以让你控制键盘灯,例如打开数字键盘灯:
1 | setleds -D +num |
1 | setleds -D -num |
+caps:打开大写灯
-scroll:清除滚动锁
+scroll:打开滚动锁
4. zenity 命令
这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询:
01 | #!/bin/bash |
02 | # Get domain name |
03 | _zenity="/usr/bin/zenity" |
04 | _out="/tmp/whois.output.$$" |
05 | domain=$(${_zenity} --title "Enter domain" \ |
06 | --entry --text "Enter the domain you would like to see whois info" ) |
07 |
08 | if [ $? -eq 0 ] |
09 | then |
10 | # Display a progress dialog while searching whois database |
11 | whois $domain | tee >(${_zenity} --width=200 --height=100 \ |
12 | --title="whois" --progress \ |
13 | --pulsate --text="Searching domain info..." \ |
14 | --auto-kill --auto-close \ |
15 | --percentage=10) >${_out} |
16 |
17 | # Display back output |
18 | ${_zenity} --width=800 --height=600 \ |
19 | --title "Whois info for $domain" \ |
20 | --text-info --filename="${_out}" |
21 | else |
22 | ${_zenity} --error \ |
23 | --text="No input provided" |
24 | fi |
5. kdialog 命令
这个命令和zenity很想,只不过它是为KDE/QT应用准备的。使用方法如下:
1 | kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found." |
你可以查看 shell scription with KDE Dialogs 来获取更多信息
6. Dialog
这个命令可以在shell脚本中显示文本组件。它使用了curses和ncurses类库。示例代码:
01 | >#!/bin/bash |
02 | dialog --title "Delete file" \ |
03 | --backtitle "Linux Shell Script Tutorial Example" \ |
04 | --yesno "Are you sure you want to permanently delete \"/tmp/foo.txt\"?" 7 60 |
05 |
06 | # Get exit status |
07 | # 0 means user hit [yes] button. |
08 | # 1 means user hit [no] button. |
09 | # 255 means user hit [Esc] key. |
10 | response=$? |
11 | case $response in |
12 | 0) echo "File deleted.";; |
13 | 1) echo "File not deleted.";; |
14 | 255) echo "[ESC] key pressed.";; |
15 | esac |
这个命令可以让你写入系统日志例如 /var/log/messages:
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 |
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分钟后把显示器设为待机状态:
1 | setterm -blank 15 -powersave powerdown -powerdown 60 |
1 | setterm -underline on; |
2 | echo "Add Your Important Message Here" |
3 | setterm -underline off |
1 | setterm -cursor off |
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 |
你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件:
/dev/tcp/host/port - 如果hostname,和port是合法的话,bash会尝试开启一个TCP连接。
/dev/udp/host/port - 如果hostname和port是合法的话,bash会开启一个UDP连接。
你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器:
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" |
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 |
Scanning TCP ports...
22 open
53 open
80 open
139 open
445 open
631 open
下面的这个例子让你的脚本扮演HTTP客户端:
01 | #!/bin/bash |
02 | exec 3<> /dev/tcp/${1:-www.cyberciti.biz}/80 |
03 |
04 | printf "GET / HTTP/1.0\r\n" >&3 |
05 | printf "Accept: text/html, text/plain\r\n" >&3 |
06 | printf "Accept-Language: en\r\n" >&3 |
07 | printf "User-Agent: nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}" >&3 |
08 | printf "\r\n" >&3 |
09 |
10 | while read LINE <&3 |
11 | do |
12 | # do something on $LINE |
13 | # or send $LINE to grep or awk for grabbing data |
14 | # or simply display back data with echo command |
15 | echo $LINE |
16 | done |
如果你使用cronjob来调用你的脚本的话,你要通过“ export DISPLAY=[user's machine]:0”命令来设置本地的 display/input 服务。例如调用 /home/vivek/scripts/monitor.stock.sh脚本,它使用了 zenity 工具:
view source
print?
1 | @hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh |
相关文章推荐
- 10个工具让你的 shell 脚本更强大
- 10个工具让你的 shell 脚本更强大
- 10个工具让你的shell脚本更强大
- 10个工具让你的 shell 脚本更强大
- 10个工具让你的 shell 脚本更强大
- 10个工具让你的 shell 脚本更强大
- 10个工具让你的 shell 脚本更强大
- 10个工具让你的 shell 脚本更强大
- 10个工具让你的 shell 脚本更强大
- (linux) 让你的 shell 脚本更强大的10个工具
- 10个工具让你的 shell 脚本更强大
- 10个工具让你的 shell 脚本更强大
- shell脚本实现随机生成10个8位密码
- mongodb集群脚本工具(shell)
- 10个实用的脚本代码工具
- shell脚本中if与case使用,查找文件locate与find的使用,压缩,解压及归档工具
- [Docker]让Docker功能更强大的10个开源工具
- shell脚本---grep、awk、sed工具
- 关于shell脚本编程的10个最佳实践
- Android 签名工具 shell脚本