很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位 置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。
1. notify-send 命令
这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包:
1
|
$
sudo
apt-get
install
libnotify-bin
|
下面这个例子展示了如何从命令行向桌面发送一个简单的消息:
1
|
notify-send
"rsnapshot done :)"
|
1
2
3
4
5
|
....
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; }
...
|
2. tput 命令
这个命令是用来设置终端特性的:
举例:
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
38
39
|
#!/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 命令
这个命令可以让你控制键盘灯,例如打开数字键盘灯:
1
|
setleds -D +num
|
关闭数字键盘灯:
1
|
setleds -D -num
|
4. zenity 命令
这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/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
|
输出:
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类库。示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
>
#!/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:
1
2
3
4
|
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分钟后把显示器设为待机状态:
1
|
setterm -blank 15 -powersave powerdown -powerdown 60
|
下面这段命令可以在中断显示加下划线的文字:
1
2
3
|
setterm -underline on;
echo
"Add Your Important Message Here"
setterm -underline off
|
或者你可以关闭光标:
1
|
setterm -cursor off
|
9. smbclient:向 MS-Windows 系统发送消息
smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息:
1
2
3
4
5
6
|
smbclient -M WinXPPro <<EOF
Message 1
Message 2
...
..
EOF
|
或者
1
|
echo
"${Message}"
| smbclient -M salesguy2
|
10. Bash Socket 编程
你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件:
你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器:
1
2
|
# 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"
|
你可以 使用循环来查找开着的端口:
1
2
3
4
5
|
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客户端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/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 工具:
1
|
@hourly DISPLAY=:0.0
/home/vivek/scripts/monitor
.stock.sh
|
所有的命令你都可以通过“man”来查询详细的使用方式。