whiptail

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

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

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

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

消息框

#!/bin/bash

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

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


shell 图形化跳板机_nginx

$?   0

布尔值选择框

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

shell 图形化跳板机_服务器_02

yes:0
no: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:布尔值框,后面可以加框内的内容

交互式输入框

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

实践

whiptail --title "曾老湿跳板机-10.0.0.61" --inputbox "请输入一个文件名路径:" 10 60 /etc/passwd 3>&1 1>&2 2>&3



## 交互式输入框
source_file=`whiptail --title "曾老湿跳板机-10.0.0.61" --inputbox "请输入源文件位置:" 10 60 3>&1 1>&2 2>&3`
if [ $? -eq 0 ];then
dest_file=`whiptail --title "曾老湿跳板机-10.0.0.61" --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.61" --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

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

密码输入框

PASSWD=`whiptail --title "曾老湿跳板机-10.0.0.61" --passwordbox "请输入一个密码名路径:" 10 60  3>&1 1>&2 2>&3`


# 实战
## 密码输入框
PASSWD=`whiptail --title "曾老湿跳板机-10.0.0.61" --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

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

菜单栏

## 菜单栏
OPTION=$(whiptail --title "曾老湿跳板机-10.0.0.61" --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.61" --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

单选框

## 语法
DISTROS=$(whiptail --title "曾老湿跳板机-10.0.0.61" --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

多选框

# 语法:
DISTROS=$(whiptail --title "曾老湿跳板机-10.0.0.61" --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.61" --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

进度条

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

作业

#!/bin/bash

## 消息框
whiptail --title "$HOSTNAME 跳板机" --msgbox \
" 欢迎来到界面很low的跳板机" 15 60
connect(){
host=$1
ping -c 1 -W 1 $host &>/dev/null
if [ $? -eq 0 ];then
if [ ! -f ~/.ssh/id_rsa ];then
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
fi
check_key=`sshpass -p 1 ssh -o 'StrictHostKeyChecking no' $host 'grep "m01" \
~/.ssh/authorized_keys 2>/dev/null |wc -l'`
if [ $check_key -eq 0 ];then
sshpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub \
$host &>/dev/null
fi
ssh $host
fi
}
jdt(){
{
for ((i = 0 ; i <= 100 ; i+=1)); do
usleep 3000
echo $i
done
} | whiptail --gauge "等一下子,正在执行" 6 60 0
}
send1(){
scp $source_file 172.16.1.5:$dest_file &>/dev/null
jdt
}
send2(){
scp $source_file 172.16.1.6:$dest_file &>/dev/null
jdt
}
send3(){
scp $source_file 172.16.1.7:$dest_file &>/dev/null
jdt
}
send4(){
scp $source_file 172.16.1.8:$dest_file &>/dev/null
jdt
}
send5(){
scp $source_file 172.16.1.9:$dest_file &>/dev/null
jdt
}

df1(){
whiptail --title "lb01 Disk Info" --msgbox "`ssh 172.16.1.5 'df -h'`" 20 60
}
df2(){
whiptail --title "lb02 Disk Info" --msgbox "`ssh 172.16.1.6 'df -h'`" 20 60
}
df3(){
whiptail --title "web01 Disk Info" --msgbox "`ssh 172.16.1.7 'df -h'`" 20 60
}
df4(){
whiptail --title "web02 Disk Info" --msgbox "`ssh 172.16.1.8 'df -h'`" 20 60
}
df5(){
whiptail --title "web03 Disk Info" --msgbox "`ssh 172.16.1.9 'df -h'`" 20 60
}

fm1(){
whiptail --title "$HOSTNAME Disk Info" --msgbox "`ssh 172.16.1.5 'free -m'`" 20 90
}
fm2(){
whiptail --title "$HOSTNAME Disk Info" --msgbox "`ssh 172.16.1.6 'free -m'`" 20 90
}
fm3(){
whiptail --title "$HOSTNAME Disk Info" --msgbox "`ssh 172.16.1.7 'free -m'`" 20 90
}
fm4(){
whiptail --title "$HOSTNAME Disk Info" --msgbox "`ssh 172.16.1.8 'free -m'`" 20 90
}
fm5(){
whiptail --title "$HOSTNAME Disk Info" --msgbox "`ssh 172.16.1.9 'free -m'`" 20 90
}

gn1(){
ps=`ssh 172.16.1.5 'ps -ef|grep [n]ginx|wc -l'`
if [ $ps -eq 0 ];then
whiptail --title "lb01" --msgbox "nginx未存活" 20 60
else
whiptail --title "lb01" --msgbox "nginx存活 \
进程数=$?" 20 60
fi
}
gn2(){
ps=`ssh 172.16.1.6 'ps -ef|grep [n]ginx|wc -l'`
if [ $ps -eq 0 ];then
whiptail --title "lb02" --msgbox "nginx未存活" 20 60
else
whiptail --title "lb02" --msgbox "nginx存活 \
进程数=$?" 20 60
fi
}
gn3(){
ps=`ssh 172.16.1.7 'ps -ef|grep [n]ginx|wc -l'`
if [ $ps -eq 0 ];then
whiptail --title "web01" --msgbox "nginx未存活" 20 60
else
whiptail --title "web01" --msgbox "nginx存活 \
进程数=$?" 20 60
fi
}
gn4(){
ps=`ssh 172.16.1.8 'ps -ef|grep [n]ginx|wc -l'`
if [ $ps -eq 0 ];then
whiptail --title "web02" --msgbox "nginx未存活" 20 60
else
whiptail --title "web02" --msgbox "nginx存活 \
进程数=$?" 20 60
fi
}
gn5(){
ps=`ssh 172.16.1.9 'ps -ef|grep [n]ginx|wc -l'`
if [ $ps -eq 0 ];then
whiptail --title "web03" --msgbox "nginx未存活" 20 60
else
whiptail --title "web03" --msgbox "nginx存活 \
进程数=$?" 20 60
fi
}

ml1(){
whiptail --title "lb01" --msgbox "`$ml`" 20 60
}
ml2(){
whiptail --title "lb02" --msgbox "`$ml`" 20 60
}
ml3(){
whiptail --title "web01" --msgbox "`$ml`" 20 60
}
ml4(){
whiptail --title "web02" --msgbox "`$ml`" 20 60
}
ml5(){
whiptail --title "web03" --msgbox "`$ml`" 20 60
}

caidan(){
fuwu=$(whiptail --title "跳板机-10.0.0.61" --menu "请根据菜单选机器" 25 60 11 \
"1" "lb01" \
"2" "lb02" \
"3" "web01" \
"4" "web02" \
"5" "web03" 3>&1 1>&2 2>&3)
}
sure(){
whiptail --title "你确定要这么做吗?" --yesno "请做出你的选择YES or NO !" 10 60
}
mingl(){
mling=$(whiptail --title "跳板机-10.0.0.61" --checklist "请在下面服务器中选择一台或多台,空格选中" 20 60 11 \
"ml1" "lb01" ON \
"ml2" "lb02" ON \
"ml3" "web01" OFF \
"ml4" "web02" OFF \
"ml5" "web03" OFF 3>&1 1>&2 2>&3)
}
grepn(){
gn=$(whiptail --title "跳板机-10.0.0.61" --checklist "请在下面服务器中选择一台或多台,空格选中" 20 60 11 \
"gn1" "lb01" ON \
"gn2" "lb02" ON \
"gn3" "web01" OFF \
"gn4" "web02" OFF \
"gn5" "web03" OFF 3>&1 1>&2 2>&3)
}
freem(){
fm=$(whiptail --title "跳板机-10.0.0.61" --checklist "请在下面服务器中选择一台或多台,空格选中" 20 60 11 \
"fm1" "lb01" ON \
"fm2" "lb02" ON \
"fm3" "web01" OFF \
"fm4" "web02" OFF \
"fm5" "web03" OFF 3>&1 1>&2 2>&3)
}
df_h(){
dff=$(whiptail --title "跳板机-10.0.0.61" --checklist "请在下面服务器中选择一台或多台,空格选中" 20 60 11 \
"df1" "lb01" ON \
"df2" "lb02" ON \
"df3" "web01" OFF \
"df4" "web02" OFF \
"df5" "web03" OFF 3>&1 1>&2 2>&3)
}
duoxuan(){
DISTROS=$(whiptail --title "跳板机-10.0.0.61" --checklist "请在下面服务器中选择一台或多台,空格选中" 20 60 11 \
"send1" "lb01" ON \
"send2" "lb02" ON \
"send3" "web01" OFF \
"send4" "web02" OFF \
"send5" "web03" OFF 3>&1 1>&2 2>&3)
}

while true ;do
OPTION=$(whiptail --title "跳板机-10.0.0.61" --menu "请从菜单中选择你想要的" 20 60 10 \
"1" "ssh远程连接" \
"2" "推送文件" \
"3" "查看磁盘空间" \
"4" "查看内存空间" \
"5" "查看服务状态" \
"6" "批量执行命令" \
"7" "小游戏放松一下吧" \
"8" "退出" 3>&1 1>&2 2>&3)

if [ $OPTION -eq 1 ];then
caidan
case $fuwu in
1)
connect 172.16.1.5
;;
2)
connect 172.16.1.6
;;
3)
connect 172.16.1.7
;;
4)
connect 172.16.1.8
;;
5)
connect 172.16.1.9
;;
esac
elif [ $OPTION -eq 2 ];then
source_file=`whiptail --title "跳板机-10.0.0.61" --inputbox " \
请输入源文件位置:" 10 60 /tmp/1.txt 3>&1 1>&2 2>&3`
if [ $? -eq 0 ];then
dest_file=`whiptail --title "跳板机-10.0.0.61" --inputbox "请输入对端存放位置:\
" 10 60 /tmp/ 3>&1 1>&2 2>&3`
if [ $? -eq 0 ];then
duoxuan
for n in $DISTROS;do
${n//\"/''}
done
else
echo '请输入一个目标路径'
fi
else
echo '请输入一个源文件路径'
fi
elif [ $OPTION -eq 3 ];then
if [ $? -eq 0 ];then
df_h
for n in $dff;do
${n//\"/''}
done
fi
elif [ $OPTION -eq 4 ];then
if [ $? -eq 0 ];then
freem
for n in $fm;do
${n//\"/''}
done
fi
elif [ $OPTION -eq 5 ];then
if [ $? -eq 0 ];then
grepn
for n in $gn;do
${n//\"/''}
done
fi
elif [ $OPTION -eq 6 ];then
ml=`whiptail --title "跳板机-10.0.0.61" --inputbox " \
请输入执行的命令:" 10 60 3>&1 1>&2 2>&3`
if [ $? -eq 0 ];then
mingl
for n in $mling;do
${n//\"/''}
done
fi
elif [ $OPTION -eq 7 ];then
sh /root/6.sh
elif [ $OPTION -eq 8 ];then
PASSWD=`whiptail --title "跳板机-10.0.0.61" --passwordbox "请输入一个密码名路径:" 10 60 3>&1 1>&2 2>&3`
if [ $? -eq 0 ];then
if [ ${#PASSWD} -ne 0 ];then
if [ $PASSWD -eq 123 ];then
exit
fi
else
whiptail --title "$HOSTNAME " --msgbox "密码为空" 20 60
fi
else
whiptail --title "$HOSTNAME Disk Info" --msgbox "你选择了取消" 20 60
fi
fi