编写包含图形界面的shell脚本:Zenity介绍

 Linux作为桌面系统正在越来越多受人关注为了改善用户体验很多员付出了大量努力不只是为了让普通用户得到更容易从Windows上迁移到Linux上同时也为传统系统管理员提供了更多方便     系统管理员通常需要在命令行上完成两类任务:批处理任务和交互式任务相信熟悉shell编程朋友都不会对前种方式感到陌生对于后种方式如何能够提供命令执行效率让交互更方便和顺畅是最重要随的产生就是些基于对话交互方式比如dialog命令:

     dialog --menu TestDialog 0 0 5 1 Menuitem1 2 Menuitem2



    可以产生如下对话框:



图1



    通过这些简单基于文本对话框我们获得了和基本交互能力当图形界面被引入的后我们有了各种更好选择比如Xdialog, gdialog和Kdialog分别是基于X.org, Gtk+和KDE图形对话框使用思路方法也和dialog命令大同小异比如以下Kdialog例子:

     kdialog --title "ACAP entry" --password "Please enter the server access code:"



    会产生个询问密码对话框:

   



图2



    这里要为大家介绍是Zenity是基于Gtk个对话框工具可以很方便应用于shell脚本的中并提供更方便交互方式比如你希望在脚本中输入个日期作为参数可以你有很多脚本这次应该用什么格式输入呢?MMDDYY?还是dd-mm-yyyy?而使用Zenity可以让你更轻松选择:

   



图3



     #zenity –calendar –date-format=%d-%m-%Y

    选中日期将以“%d-%m-%Y”格式返回和date命令对日期格式定义是:“04-08-2008”

下面我们用个举例脚本来演示下zenity使用方法:

   

 #!/bin/bash
FINDLOG="Find MyApp log files"
ADDUSER="Add a user"
CONHOST="Connect to a remote host"
function findlog
{
        DATESEL=`zenity --calendar --title="Select a day" --text="To view the log files of 'My App'
updated in a single day, please select a date" --date
-format=%m-%d-%Y`
        zenity --text-info --title="myapp-$DATESEL.log" --filename="myapp-$DATESEL.log"
}
function adduser1
{
        USERNAME=`zenity --entry --text="Please input user name:" --title "Input User Name"`
        PASSWORD1=`zenity --entry --text="Please input passoword:" --title "Input Password" --
hide-text`
        PASSWORD2=`zenity --entry --text="Please input passoword again:" --title "Input
Password" --hide-text`
        while [ "$PASSWORD1" != "$PASSWORD2" ]
        do
                zenity --error --text="Passwords do not match"
                PASSWORD1=`zenity --entry --text="Please input passoword:" --title "Input
Password" --hide-text`
                PASSWORD2=`zenity --entry --text="Please input passoword again:" --title "Input
Password" --hide-text`

Done
   ENCRYPTEDPASSWORD=`echo $PASSWORD | makepasswd –clear-form=- --crypt | awk
‘{pr $2}’`
        useradd $USERNAME –p $ENCRYPTEDPASSWORD
}
function conhost
{
        HOSTSEL=`zenity --list --editable --separator="@" --pr-column=ALL --title "Host
Selection" --column Host --column User Toast root`
        ssh ${HOSTSEL#*@}@${HOSTSEL%@*}
}
############################
#
# 主
#
###########################
# zenity --info --title="Zenity Demo" --text="Press Enter to start the demo program of Zenity"
export SELECTION=`zenity --list --radiolist --title="Command Center" --text="Select the
operation you want to perform" --column "" --column "Command" Tru
e "$FINDLOG" False "$ADDUSER" False "$CONHOST"`
[ -z "$SELECTION" ]
then
        exit 0
fi
[ "$SELECTION" = "$FINDLOG" ]
then
        findlog
el [ "$SELECTION" = "$ADDUSER" ]
then
        adduser1

el [ "$SELECTION" = "$CONHOST" ]
then
        conhost
fi





 

    这段代码做了几件简单事情首先主部分(见注释)是个由zenity生成列表用来让用户选择最常用几个功能:

   



图4



    这个是个用到了Zenity提供List功能注意缺省情况下这个对话框返回值是被选中行但是列被设置成了Radiobox所以返回是第 2列如果希望多选可以使用—check-list选项

    选择了希望执行操作的后就会转到对应shell这个脚本提供了 3个功能搜索某个应用在某日志文件添加个新用户和用SSH连接到另个主机我们先来看下第个功能这个功能需要输入是个日期然后查找名字为“MyApp-日期.log”日志文件

   



图5



    需要只是选择个日期

    第 2个功能是添加个用户需要输入需要添加系统用户名字:

   



图6

输入用户名的后需要输入两次用户密码使用了—hide-text选项用户输入都被显示成“*”

   



图7



    如果两次输入不会被要求重新输入

   



图8



    如果输入正确那么个系统用户将被成功添加

    第 3个功能是连接个远端主机这次仍然是使用List但是没有使用Radio List所以可以通过点击行任何个位置来选择:

   



图9



    这两个参数:--separator="@" --pr-column=ALL 作用是返回Toast@root这样格式这个显然不符合SSH要求所以用bash串替换功能来处理下再作为SSH参数:ssh ${HOSTSEL#*@}@${HOSTSEL%@*}

    上面就是对这个脚本简单解释只是个举例在实际工作中zenity还可以提供更多能力来帮助大家写出更易用和强大脚本来

Tags: 

延伸阅读

最新评论

发表评论