linux ssh字符类型,使用whiptail写linux字符界面ssh链接工具2.0

本文介绍了如何通过whiptail命令行界面工具改进SSH链接工具,使用json格式存储和管理多组SSH配置,展示了如何解析json并实现分组选择和ssh链接功能。作者还演示了如何使用jq工具进行json操作,提升配置文件的清晰度和易用性。
摘要由CSDN通过智能技术生成

先看一下效果

选择分组

aa3834f603c7f2c251bbb39f87cab663.png

选择服务器

252020f8b9690b9c52ce791f54598b42.png

开始链接

2a2307d0e7d7c932999c84618ac858fb.png

为什么写

之前写过一个字符界面的链接工具,但是看起来比较简陋,他是这个样子的:

5c02035495945d40949e1bc4c4ec617a.png

看起来十分不好看。后来在网上看到shell中有一个whiptail工具可以制作各种命令行里的工具,于是就搜索了一下教程,然后就将之前的ssh工具重新写了一下。

whiptail 简单介绍

这里我只用到了whiptail的菜单栏和提示框,所以这里就只说这两种用法:

1:菜单框

语法:

whiptail --menu 菜单名称 高 宽 显示多少条 [标示 菜单项] ...

例子:

whiptail --menu 这是一个菜单 15 30 2 1 菜单一 2 菜单二

2124ea5fa3dfb506ea15eb12de38236f.png

2: 提示框

语法:

whiptail --msgbox 消息信息 高 宽

例子:

whiptail --msgbox 这是消息框 10 20

3ce3df027d0d0512aea91672bd53d9bc.png

有这两个框框,就已经可以满足我的需求啦,现在就可以写了

写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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值