zoukankan      html  css  js  c++  java
  • 使用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。它的官网在这里 https://stedolan.github.io/jq/,大家可以看看。
    我这这里只是简单的说一下这个怎么用。我用上面写的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
    这里可以参考写之前写的内容,写一个有字符界面的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
    "; exp_continue }
                "password" { send "${password}
    " }
            }
            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

  • 相关阅读:
    php无刷新上传图片和文件
    wamp(win1064位家庭版+apache2.4.20+php5.5.37+mysql5.5.50)环境搭建
    linux下常见解压缩命令
    nginx虚拟主机配置小结
    Nginx下配置ThinkPHP的URL Rewrite模式和pathinfo模式支持
    iframe 高度自适应/以及在ie8中空白问题
    小程序-调用公共js对象方法/ app.js
    小程序-tabbar相关样式设置
    微信小程序连接无法跳转/ can not navigate to tabBar page错误
    微信小程序-tabBar无法显示问题解析
  • 原文地址:https://www.cnblogs.com/hebaibai/p/10472109.html
Copyright © 2011-2022 走看看