先看一下效果

选择分组



选择服务器

开始链接

为什么写

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



看起来十分不好看。后来在网上看到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\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

使用whiptail写linux字符界面ssh链接工具2.0的更多相关文章

  1. linux复习3:linux字符界面的操作

    一.前言 1.对linux服务器进行管理的时候,经常要进入字符界面进行操作,使用命令需要记住该命令的相关选项和参数.vi编辑器可以用于编辑任何ASCII文本,功能非常的强大,可以对文本进行创建.查找. ...

  2. 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍

    两款[linux字符界面下]显示[菜单],[选项]的powershell脚本模块介绍 powershell linux  ps1 menu choice Multiselect 传教士 菜单 powe ...

  3. 写一个有字符界面的ssh链接工具

    大概的样子 这是大致的样子- 写之前想说的 因为个人工作的的电脑是deepin系统的,系统本身的命令行非常好用,用第三方的ssh工具用不习惯,就想自己写一个. shell脚本是第一次写,写的不是很好, ...

  4. linux 字符界面浏览器 w3m(转)

    最近找到了几个linux终端下使用的浏览器,主要用来测试本机web服务器是否搭建成功.因为我们一般是用ssh客户端连接linux的,所以很需要一个字符界面的浏览器.找了几个显示都不理想,只有w3m用起 ...

  5. Linux字符界面下用户账户的设置

    在Linux系统字符界面下创建.修改以及删除用户账户主要使用useradd,usermod和userdel这3个命令. 一.创建用户账户 创建用户账户就是在系统中创建一个新账户,然后为新账户分配用户U ...

  6. Linux字符界面和图形界面

    Ubuntu图形界面和字符界面的切换 Ubuntu和其他的Linux系统一样,有图形界面和字符界面,同时能够设置默认的启动界面. linux的显示界面分为命令行的字符界面和图形界面,我们可以设置lin ...

  7. Linux字符界面的优势

    优势一:字符界面占用的系统资源更少,更加适合服务器 优势二:字符界面减少了出错.被攻击的可能性(一.二决定了服务器一般不装图形界面,安全稳定优先)

  8. linux字符界面下root用户无法登录成功

    os: rhel5.6_x86_64 ———————————————————————————————————————————— 故障:图形界面登录正常,其他一切正常,但是切换到字符界面时,输入用户ro ...

  9. yum管理——linux字符界面安装图形化及两种界面的切换(3)

    1.查看yum软件包组 yum groups list 2.选择安装带 GUI 的服务器 yum groups install "带 GUI 的服务器" 3.字符界面切换为图形化界 ...

随机推荐

  1. ASP.Net Core 2.2 MVC入门到基本使用系列 (二)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...

  2. 操作Checkbox标签

    在前端开发中,少不了对Checkbox的操作. 常用的的方法有2个:.is()和.prop()方法.前者是判断 checkbox的状态,选不是未选.而后者为checkbox设置一个值,可以设置chec ...

  3. Flask系列05--Flask的配置config

    一.flask配置 示例说明, 就是使用config进行配置 from flask import Flask ​ app = Flask(__name__) # type:Flask app.conf ...

  4. 201621123018《Java程序设计》第7周学习报告

    1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 事件.事件源. 事件监听器.事件处理方法 1.2 任 ...

  5. jQuery基础(2)

    一.jQuery的属性操作 jQuery的属性操作分为四部分: html标签属性操作:是对html文档中的标签属性进行读取,设置和移除操作.比如attr().removeAttr(): DOM属性操作 ...

  6. npm包发布记录

    下雪了,在家闲着,不如写一个npm 包发布.简单的 npm 包的发布网上有很多教程,我就不记录了.这里记录下,一个复杂的 npm 包发布,复杂指的构建环境复杂. 整个工程使用 rollup 来构建,其 ...

  7. centos7 完整配置openvpn详情教程

    1. 什么是OpenVpn OpenVPN 是一个用于创建虚拟专用网络加密通道的软件包,最早是由James Yonan编写的.OpenVPN允许创建的VPN使用公开密钥.电子证书.或者用户名/密码来进 ...

  8. Zookeeper配置文件中的配置项解释和Zookeeper的安装

    zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg.其中各配置项的含义,解释如下: 1.tickTime:CS通信心跳时间Zoo ...

  9. 线程中的定时器Timer类

    Timer 定时器 几分钟之后执行一个任务. 创建了一个定时器相当于开启了一条线程,TimerTask相当于一个线程的任务.内部使用wait/notify机制来实现的. 用法非常的简单  就足以里面的 ...

  10. 图片训练:使用卷积神经网络(CNN)识别手写数字

    这篇文章中,我们将使用CNN构建一个Tensorflow.js模型来分辨手写的数字.首先,我们通过使之“查看”数以千计的数字图片以及他们对应的标识来训练分辨器.然后我们再通过此模型从未“见到”过的测试 ...