使用whiptail写linux字符界面ssh链接工具2.0
先看一下效果
选择分组
选择服务器
开始链接
为什么写
之前写过一个字符界面的链接工具,但是看起来比较简陋,他是这个样子的:
看起来十分不好看。后来在网上看到shell中有一个whiptail工具可以制作各种命令行里的工具,于是就搜索了一下教程,然后就将之前的ssh工具重新写了一下。
whiptail 简单介绍
这里我只用到了whiptail的菜单栏和提示框,所以这里就只说这两种用法:
1:菜单框
语法:
whiptail --menu 菜单名称 高 宽 显示多少条 [标示 菜单项] ...
例子:
whiptail --menu 这是一个菜单 15 30 2 1 菜单一 2 菜单二
2: 提示框
语法:
whiptail --msgbox 消息信息 高 宽
例子:
whiptail --msgbox 这是消息框 10 20
有这两个框框,就已经可以满足我的需求啦,现在就可以写了
写ssh的配置文件
之前写的配置文件看起来不是很清晰,添加起来比较容易出错,现在我使用json格式的文件来保存多个ssh的配置,它看起来是这样的:
[{ "name": "何白白", "server": [{ "name": "腾讯", "ip": "127.0.0.1", "user": "用户名", "pwd": "密码" }] }]
用的是一个数组,每一个数组代表一个分组,name是分组信息,server是这个组里的ssh配置,可以有多个。
现在配置文件写完了,我们看一下怎么在shell里解析json
在shell脚本中解析json
这里我是用用 jq 这个工具来做的,当然这个jq 不是 jquery。它的官网在这里 ,大家可以看看。
我这这里只是简单的说一下这个怎么用。我用上面写的ssh配置举例:
1:取出数组中第一个元素
命令: 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
现在基本的操作方法也有了,现在开始写功能吧
根据ssh配置显示ssh分组信息
这里我们需要将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
这里可以参考写之前写的内容,
这样其实就写完了。
最后,把所有的代码贴出来吧
#!/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
上一篇: 心疼这小凳子