[toc]

whiptail概述

在CentOS6系统中,我们可以使用setup指令来修改网卡的IP等信息,交互起来十分方便
在CentOS7系统中,setup命令已经没有了,但是还有nmtui命令,可以让我们修改IP和主机名。

那么whiptail命令的作用,就是出现一个可以交互的图形化界面,并且样式有很多。

在之前的课程中,我们已经使用流程控制语句,满足了一个跳板机的需求,但是我们还想是想更多的功能,当然脚本也都能实现,但是我们想要更炫酷的,脱离死气沉沉的命令行。

那么我们就一起来看一下,whiptail可以实现哪些需求吧…

消息框

1
2
3
4
5
6
7
8
9
#!/bin/bash

# 消息框
whiptail --title "$HOSTNAME Disk Info" --msgbox "`df -h`" 30 60

--title: #指定标题内容:$HOSTNAME Disk Info
--msgbox: #指定信息内容:`df -h`
30: #展示信息框的高度为:30
60: #展示信息框的宽度为:60

返回值

1
2
echo $?
0

单选框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 语法
DISTROS=$(whiptail --title "暴龙战士的跳板机-10.0.0.7" --radiolist "请在下面内容选择一项,上下左右移动,空格选中" 20 60 10 \
"send" "发送文件" OFF \
"useradd" "创建用户" OFF \
"ssh" "远程连接" ON \
"mem" "查看内存" OFF 3>&1 1>&2 2>&3)

# 选项
--radiolist:单选框
OFF:默认没有被选中
ON:默认被选中

多选没有意义,后面的选项会覆盖前面的选项

# 返回值
选择OK:0
选择Cancel:1

多选框

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
# 语法:
DISTROS=$(whiptail --title "暴龙战士的跳板机-10.0.0.7" --checklist "请在下面内容选择一项,上下左右移动,空格选中" 20 60 10 \
"send" "发送文件" ON \
"useradd" "创建用户" OFF \
"ssh" "远程连接" OFF \
"mem" "查看内存" OFF 3>&1 1>&2 2>&3)


# 多选框实战

send(){
echo 执行send函数
}

mem(){
echo 执行mem函数
}

DISTROS=$(whiptail --title "暴龙战士的跳板机-10.0.0.7" --checklist "请在下面内容选择一项,上下左右移动,空格选中" 20 60 10 \
"send" "发送文件" ON \
"useradd" "创建用户" OFF \
"ssh" "远程连接" OFF \
"mem" "查看内存" OFF 3>&1 1>&2 2>&3)

echo $?
echo $DISTROS

for n in $DISTROS;do
${n//\"/''}
done

# 返回值:
选择OK:0
选择Cancel:1

实战示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
send(){
echo 执行send函数
}

DISTORS=$(whiptail --title "暴龙战士的跳板机-10.0.0.7" --radiolist \
"请在下面内容选择一项, 上下移动,空格选中 TAB选择OK或退出" 10 60 4 \
"send" "发送文件" ON \
"Useradd" "创建用户" OFF \
"ssh" "远程连接" ON \
"mem" "查看内存" OFF 3&>1 1&>2 2&>3)
echo $?
echo $DISTROS

for n in $DISTORS;do
${n//\"/''}
done

布尔值选择框

1
2
3
# 布尔值选择框
whiptail --title "你确定要这么做吗?" --yesno "请做出你的选择YES or NO !" 10 60
echo $?

返回值

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
# yes
echo $?
0

# no
echo $?
1

# 布尔值选择框案例一:
whiptail --title "你确定要这么做吗?" --yesno "请做出你的选择YES or NO !" 10 60
if [ $? -eq 0 ];then
echo '选择的yes'
else
echo '选择的是no'
fi

# 布尔值选择框案例二:
whiptail --title "你确定要这么做吗?" --yes-button "运维" --no-button "开发" --yesno "请选择你在公司的岗位" 10 60
if [ $? -eq 0 ];then
echo '你的岗位是运维'
else
echo '你的岗位是开发'
fi

--titlle:标题
--yes-button:yes的按钮可以改名
--no-button:no的按钮可以改名
--yesno:布尔值框,后面可以加框内的内容

交互式输入框

1
2
语法:
whiptail --title "<标题>" --inputbox "<信息>" <高度> <宽度> <默认值>

实战示例

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
whiptail --title "跳板机-10.0.0.7" --inputbox "请输入一个文件名路径:" 10 60 /etc/passwd 3>&1 1>&2 2>&3

# 交互式输入框
source_file=`whiptail --title "跳板机-10.0.0.7" --inputbox "请输入源文件位置:" 10 60 3>&1 1>&2 2>&3`
if [ $? -eq 0 ];then
dest_file=`whiptail --title "暴龙战士的跳板机-10.0.0.7" --inputbox "请输入对端存放位置:" 10 60 /etc/passwd 3>&1 1>&2 2>&3`
if [ $? -eq 0 ];then
scp $source_file 172.16.1.7:$dest_file &>/dev/null
else
echo '请输入一个目标路径'
fi
else
echo '请输入一个源文件路径'
fi


# 交互式输入框
source_file=`whiptail --title "暴龙战士的跳板机-10.0.0.7" --inputbox "请输入源文件位置:" 10 60 3>&1 1>&2 2>&3`

whiptail --title "$HOSTNAME Disk Info" --msgbox "$source_file" 30 60


# 选项
--inputbox:交互式输入框
10 60 /etc/passwd
10:高度
60:宽度
/etc/passwd:默认值


# 返回值
选择OK:0
选择Cancel:1

命令本身带输入内容,输入内容可以保存在变量中

密码输入框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PASSWD=`whiptail --title "暴龙战士的跳板机-10.0.0.7" --passwordbox "请输入一个密码名路径:" 10 60  3>&1 1>&2 2>&3`

# 示例:
## 密码输入框
PASSWD=`whiptail --title "暴龙战士的跳板机-10.0.0.7" --passwordbox "请输入一个密码名路径:" 10 60 3>&1 1>&2 2>&3`
if [ $? -eq 0 ];then
if [ ${#PASSWD} -ne 0 ];then
echo "密码是:$PASSWD"
else
echo "密码为空"
fi
else
echo '选择了取消'
fi

# 返回值
选择OK:0
选择Cancel:1

命令本身带输入内容,输入内容可以保存在变量中

菜单栏

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
40
41
42
OPTION=$(whiptail --title "暴龙战士的跳板机-10.0.0.7" --menu "根据菜单选吧老弟" 30 60 10 \
"1" "lb01" \
"2" "lb02" \
"3" "web01" \
"4" "web02" \
"5" "web03" 3>&1 1>&2 2>&3)

--menu:菜单栏
30:高度
60:宽度
10:菜单显示几行内容


# 返回值
选择OK:0
选择Cancel:1


选择的值,会将序号保存在OPTION变量中

# 示例:
## 菜单栏
OPTION=$(whiptail --title "暴龙战士的跳板机-10.0.0.7" --menu "根据菜单选吧老弟" 30 60 10 \
"1" "lb01" \
"2" "lb02" \
"3" "web01" \
"4" "web02" \
"5" "web03" 3>&1 1>&2 2>&3)

if [ $? -eq 0 ];then
case $OPTION in
1)
echo "连接 lb01"
;;
3)
ssh 172.16.1.7
;;
esac
else
echo "选择了退出"

fi

实战示例

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

OPTION=$(whiptail --title "跳板机-10.0.0.7" --menu "请根据菜单选择" 30 60 4 \
"1" "lb01" \
"2" "lb02" \
"3" "web01" \
"4" "web02" \
"5" "web03" 3>&1 1>&2 2>&3)
if [ $? -eq 0 ];then
case $OPTION in
1)
echo 连接到lb01
ssh 172.16.1.5
;;
2)
echo 连接到lb02
ssh 172.16.1.6
;;
3)
echo 连接到webo1
ssh 172.16.1.7
;;
4)
echo 连接到web02
ssh 172.16.1.8
;;
5)
echo 连接到wen03
ssh 172.16.1.9
;;
esac
else
echo 选择了退出
fi

进度条

1
2
3
4
5
6
{
for ((i = 0 ; i <= 100 ; i+=30)); do
sleep 1
echo $i
done
} | whiptail --gauge "等一下子,正在安装" 6 60 0