前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用shell写ssh快速链接工具-2.0

用shell写ssh快速链接工具-2.0

作者头像
何白白
发布2019-06-28 11:18:58
2.1K0
发布2019-06-28 11:18:58
举报

用shell写ssh快速链接工具-2.0

先看一下效果

选择分组:

选择服务器 :

开始链接:

为什么写

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

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

whiptail 简单介绍

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

1:菜单框

语法:

代码语言:javascript
复制
whiptail --menu 菜单名称 高 宽 显示多少条 [标示 菜单项] ...

例子:

代码语言:javascript
复制
whiptail --menu 这是一个菜单 15 30 2 1 菜单一 2 菜单二
2: 提示框

语法:

代码语言:javascript
复制
whiptail --msgbox 消息信息 高 宽

例子:

代码语言:javascript
复制
whiptail --msgbox 这是消息框 10 20

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

写ssh的配置文件

之前写的配置文件看起来不是很清晰,添加起来比较容易出错,现在我使用json格式的文件来保存多个ssh的配置,它看起来是这样的:

代码语言:javascript
复制
[{
    "name": "何白白",
    "server": [{
        "name": "腾讯",
        "ip": "127.0.0.1",
        "user": "用户名",
        "pwd": "密码",
        "port":"22"
    }]
}]

用的是一个数组,每一个数组代表一个分组,name是分组信息,server是这个组里的ssh配置,可以有多个。 现在配置文件写完了,我们看一下怎么在shell里解析json

在shell脚本中解析json

这里我是用用 jq 这个工具来做的,当然这个jq 不是 jquery。它的官网在这里 https://stedolan.github.io/jq/,大家可以看看。 我这这里只是简单的说一下这个怎么用。我用上面写的ssh配置举例:

1:取出数组中第一个元素
代码语言:javascript
复制
jq .[0] ssh.json
结果:
{
  "name": "何白白",
  "server": [
    {
      "name": "腾讯",
      "ip": "127.0.0.1",
      "user": "用户名",
      "pwd": "密码",
      "port":"22"
    }
  ]
}
2:按照json的key来取值
代码语言:javascript
复制
命令:
jq .[0].name ssh.json
结果(这个结果是带引号的)
"何白白"

如果不需要引号:
jq -r .[0].name ssh.json
结果:
何白白
3:取出所有的key 与 获取数组长度

假设有一个json文件,test.json,内容如下:

代码语言:javascript
复制
{
      "name": "腾讯",
      "ip": "127.0.0.1",
      "user": "用户名",
      "pwd": "密码"
}

执行:

代码语言:javascript
复制
获取所有的key:
jq keys test.json
结果:
[
  "ip",
  "name",
  "pwd",
  "user"
]

获取上面执行结果的长度:
jq keys test.json | jq length
结果:
4

现在基本的操作方法也有了,现在开始写功能吧

根据ssh配置显示ssh分组信息

这里我们需要将json中的所有的分组名称找到,并且显示成一个菜单。

1:首先我们需要将json数组中每个对象的name属性找出来

这样写:

代码语言:javascript
复制
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 … “ 这个样子,所以

代码语言:javascript
复制
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

这样就可以吧分组信息展示出来了,但是这里有一个问题,不知道用户选择了那一项。所以还需要将菜单的选择结果拿到,并且判断有没有选择取消按钮。这样写

代码语言:javascript
复制
    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

这里可以参考写之前写的内容,用shell写ssh快速链接工具-1.0

这样其实就写完了。

最后,把所有的代码贴出来吧

代码语言:javascript
复制
#!/bin/bash
error_code=9999
config_file='/home/hjx/sh/conf/ssh.json'

# 链接ssh
ssh(){
    ssh_ip_user=$1
    password=$2
    port=$3
    command=$4
    clear
    expect -c "
        set timeout 300
        spawn ssh -p$port $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`
    length=`jq .[$1].server $config_file | jq 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
        user=`jq -r .[$1].server[$choose].user $config_file`
        ip=`jq -r .[$1].server[$choose].ip $config_file`
        pwd=`jq -r .[$1].server[$choose].pwd $config_file`
        port=`jq -r .[$1].server[$choose].port $config_file`

        ssh $user"@"$ip $pwd $port
    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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用shell写ssh快速链接工具-2.0
    • 先看一下效果
      • 为什么写
        • whiptail 简单介绍
          • 写ssh的配置文件
            • 在shell脚本中解析json
              • 根据ssh配置显示ssh分组信息
                • 最后,把所有的代码贴出来吧
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档