选择分组jquery
开始连接git
以前写过一个字符界面的连接工具,可是看起来比较简陋,他是这个样子的:github
这里我只用到了whiptail的菜单栏和提示框,因此这里就只说这两种用法: 1:菜单框 语法:shell
whiptail --menu 菜单名称 高 宽 显示多少条 [标示 菜单项] ...
复制代码
例子:json
whiptail --menu 这是一个菜单 15 30 2 1 菜单一 2 菜单二
复制代码
whiptail --msgbox 消息信息 高 宽
复制代码
例子:数组
whiptail --msgbox 这是消息框 10 20
复制代码
以前写的配置文件看起来不是很清晰,添加起来比较容易出错,如今我使用json格式的文件来保存多个ssh的配置,它看起来是这样的:bash
[{
"name": "何白白",
"server": [{
"name": "腾讯",
"ip": "127.0.0.1",
"user": "用户名",
"pwd": "密码"
}]
}]
复制代码
用的是一个数组,每个数组表明一个分组,name是分组信息,server是这个组里的ssh配置,能够有多个。 如今配置文件写完了,咱们看一下怎么在shell里解析json服务器
这里我是用用 jq 这个工具来作的,固然这个jq 不是 jquery。它的官网在这里 stedolan.github.io/jq/,你们能够看看。 我这这里只是简单的说一下这个怎么用。我用上面写的ssh配置举例: 1:取出数组中第一个元素ssh
命令:
jq .[0] ssh.json
结果:
{
"name": "何白白",
"server": [
{
"name": "腾讯",
"ip": "127.0.0.1",
"user": "用户名",
"pwd": "密码"
}
]
}
复制代码
2:按照json的key来取值工具
命令:
jq .[0].name ssh.json
结果(这个结果是带引号的)
"何白白"
若是不须要引号:
jq -r .[0].name ssh.json
结果:
何白白
复制代码
3:取出全部的key 与 获取数组长度 假设有一个json文件,test.json,内容以下:
{
"name": "腾讯",
"ip": "127.0.0.1",
"user": "用户名",
"pwd": "密码"
}
复制代码
执行:
获取全部的key:
jq keys test.json
结果:
[
"ip",
"name",
"pwd",
"user"
]
获取上面执行结果的长度:
jq keys test.json | jq length
结果:
4
复制代码
如今基本的操做方法也有了,如今开始写功能吧
这里咱们须要将json中的全部的分组名称找到,而且显示成一个菜单。 1:首先咱们须要将json数组中每一个对象的name属性找出来,这样写:
for i in $(seq `jq length $config_file`)
do
index=`expr $i - 1`
#打印全部的name
echo `jq -r .[$index].name $config_file`
done
复制代码
2:将全部name显示成菜单 由于 whiptail 的要求,咱们要将name 拼接成" 标示1 菜单1 标示2 菜单2 ... " 这个样子,因此
menu=""
for i in $(seq `jq length $config_file`)
do
index=`expr $i - 1`
menu=$menu$index" "`jq -r .[$index].name $config_file`" "
done
whiptail --title "欢迎使用ssh连接工具" --menu "请选择连接分组:" 20 50 8 $menu
复制代码
这样就能够吧分组信息展现出来了,可是这里有一个问题,不知道用户选择了那一项。因此还须要将菜单的选择结果拿到,而且判断有没有选择取消按钮。这样写
choose=$(whiptail --title "欢迎使用ssh连接工具" --menu "请选择连接分组:" 20 50 8 $menu 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]
then
#这里写用户选择分组后接下来的事情
#主要就是按照选择的下标,找到对应的json数据,将里面的ssh信息再用一个菜单项显示出来
#用户再次选择后,取到其中的 ip 用户名 密码,最后连接ssh就行了
echo $choose
else
echo 'exit'
fi
复制代码
choose:表明用户选择的第几个菜单 exitstatus :表明用户有没有选择取消按钮 值不等于0时表明选择的取消 3:这一步就和上一步差很少了,就不写了 4:连接ssh 这里能够参考写以前写的内容,写一个有字符界面的ssh连接工具
这样其实就写完了。
#!/bin/bash
error_code=9999
#这里是配置文件的地址
config_file='/home/hjx/ssh.json'
# 连接ssh
ssh(){
ssh_ip_user=${1}
password=${2}
command=${3}
whiptail --title "欢迎使用ssh连接工具" --msgbox "正在连接:$ssh_ip_user" 10 50
clear
expect -c "
set timeout 300
spawn ssh -p22 ${ssh_ip_user} ${command}
expect {
\"yes/no\" { send \"yes\r\"; exp_continue }
\"password\" { send \"${password}\r\" }
}
interact
"
}
#显示分组中的服务器
show_server(){
key=`jq -r .[$1].name $config_file`
echo "choose key : $key"
length=`jq .[$1].server $config_file | jq length`
echo "length $length"
menu=""
for i in $(seq $length)
do
index=`expr $i - 1`
menu=$menu$index" "`jq -r .[$1].server[$index].name $config_file`"-"`jq -r .[$1].server[$index].ip $config_file`" "
done
choose=$(whiptail --title "您选择的分组:$key" --menu "请选择要链接的服务器:" 20 50 8 $menu 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]
then
ssh `jq -r .[$1].server[$choose].user $config_file`"@"`jq -r .[$1].server[$choose].ip $config_file` `jq -r .[$1].server[$choose].pwd $config_file`
else
index
fi
}
#打开菜单导航
index(){
menu=""
for i in $(seq `jq length $config_file`)
do
index=`expr $i - 1`
menu=$menu$index" "`jq -r .[$index].name $config_file`" "
done
choose=$(whiptail --title "欢迎使用ssh连接工具" --menu "请选择连接分组:" 20 50 8 $menu 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]
then
show_server $choose
else
echo 'exit'
fi
}
index
复制代码
原文地址: http://www.hebaibai.com/?p=315