先看一下效果

选择分组



选择服务器

开始链接

为什么写

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



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

whiptail 简单介绍

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

1:菜单框

语法:

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

例子:

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



2: 提示框

语法:

  1. whiptail --msgbox 消息信息

例子:

  1. whiptail --msgbox 这是消息框 10 20



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

写ssh的配置文件

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

  1. [{
  2. "name": "何白白",
  3. "server": [{
  4. "name": "腾讯",
  5. "ip": "127.0.0.1",
  6. "user": "用户名",
  7. "pwd": "密码"
  8. }]
  9. }]

用的是一个数组,每一个数组代表一个分组,name是分组信息,server是这个组里的ssh配置,可以有多个。

现在配置文件写完了,我们看一下怎么在shell里解析json

在shell脚本中解析json

这里我是用用 jq 这个工具来做的,当然这个jq 不是 jquery。它的官网在这里 https://stedolan.github.io/jq/,大家可以看看。

我这这里只是简单的说一下这个怎么用。我用上面写的ssh配置举例:

1:取出数组中第一个元素

  1. 命令:
  2. jq .[0] ssh.json
  3. 结果:
  4. {
  5. "name": "何白白",
  6. "server": [
  7. {
  8. "name": "腾讯",
  9. "ip": "127.0.0.1",
  10. "user": "用户名",
  11. "pwd": "密码"
  12. }
  13. ]
  14. }

2:按照json的key来取值

  1. 命令:
  2. jq .[0].name ssh.json
  3. 结果(这个结果是带引号的)
  4. "何白白"
  5. 如果不需要引号:
  6. jq -r .[0].name ssh.json
  7. 结果:
  8. 何白白

3:取出所有的key 与 获取数组长度

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

  1. {
  2. "name": "腾讯",
  3. "ip": "127.0.0.1",
  4. "user": "用户名",
  5. "pwd": "密码"
  6. }

执行:

  1. 获取所有的key
  2. jq keys test.json
  3. 结果:
  4. [
  5. "ip",
  6. "name",
  7. "pwd",
  8. "user"
  9. ]
  10. 获取上面执行结果的长度:
  11. jq keys test.json | jq length
  12. 结果:
  13. 4

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

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

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

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

  1. for i in $(seq `jq length $config_file`)
  2. do
  3. index=`expr $i - 1`
  4. #打印所有的name
  5. echo `jq -r .[$index].name $config_file`
  6. done

2:将所有name显示成菜单

因为 whiptail 的要求,我们要将name 拼接成" 标示1 菜单1 标示2 菜单2 ... " 这个样子,所以

  1. menu=""
  2. for i in $(seq `jq length $config_file`)
  3. do
  4. index=`expr $i - 1`
  5. menu=$menu$index" "`jq -r .[$index].name $config_file`" "
  6. done
  7. whiptail --title "欢迎使用ssh链接工具" --menu "请选择链接分组:" 20 50 8 $menu

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

  1. choose=$(whiptail --title "欢迎使用ssh链接工具" --menu "请选择链接分组:" 20 50 8 $menu 3>&1 1>&2 2>&3)
  2. exitstatus=$?
  3. if [ $exitstatus = 0 ]
  4. then
  5. #这里写用户选择分组后接下来的事情
  6. #主要就是按照选择的下标,找到对应的json数据,将里面的ssh信息再用一个菜单项显示出来
  7. #用户再次选择后,取到其中的 ip 用户名 密码,最后链接ssh就好了
  8. echo $choose
  9. else
  10. echo 'exit'
  11. fi

choose:代表用户选择的第几个菜单

exitstatus :代表用户有没有选择取消按钮 值不等于0时代表选择的取消

3:这一步就和上一步差不多了,就不写了

4:链接ssh

这里可以参考写之前写的内容,写一个有字符界面的ssh链接工具

这样其实就写完了。

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

  1. #!/bin/bash
  2. error_code=9999
  3. #这里是配置文件的地址
  4. config_file='/home/hjx/ssh.json'
  5. # 链接ssh
  6. ssh(){
  7. ssh_ip_user=${1}
  8. password=${2}
  9. command=${3}
  10. whiptail --title "欢迎使用ssh链接工具" --msgbox "正在链接:$ssh_ip_user" 10 50
  11. clear
  12. expect -c "
  13. set timeout 300
  14. spawn ssh -p22 ${ssh_ip_user} ${command}
  15. expect {
  16. \"yes/no\" { send \"yes\r\"; exp_continue }
  17. \"password\" { send \"${password}\r\" }
  18. }
  19. interact
  20. "
  21. }
  22. #显示分组中的服务器
  23. show_server(){
  24. key=`jq -r .[$1].name $config_file`
  25. echo "choose key : $key"
  26. length=`jq .[$1].server $config_file | jq length`
  27. echo "length $length"
  28. menu=""
  29. for i in $(seq $length)
  30. do
  31. index=`expr $i - 1`
  32. menu=$menu$index" "`jq -r .[$1].server[$index].name $config_file`"-"`jq -r .[$1].server[$index].ip $config_file`" "
  33. done
  34. choose=$(whiptail --title "您选择的分组:$key" --menu "请选择要连接的服务器:" 20 50 8 $menu 3>&1 1>&2 2>&3)
  35. exitstatus=$?
  36. if [ $exitstatus = 0 ]
  37. then
  38. 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`
  39. else
  40. index
  41. fi
  42. }
  43. #打开菜单导航
  44. index(){
  45. menu=""
  46. for i in $(seq `jq length $config_file`)
  47. do
  48. index=`expr $i - 1`
  49. menu=$menu$index" "`jq -r .[$index].name $config_file`" "
  50. done
  51. choose=$(whiptail --title "欢迎使用ssh链接工具" --menu "请选择链接分组:" 20 50 8 $menu 3>&1 1>&2 2>&3)
  52. exitstatus=$?
  53. if [ $exitstatus = 0 ]
  54. then
  55. show_server $choose
  56. else
  57. echo 'exit'
  58. fi
  59. }
  60. 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 MVC 项目设置,移除多余的响应头,woff,woff2 字体文件请求处理

    移除 X-AspNetMvc-Version 在 Global.asax 的 Application_Start添加代码 MvcHandler.DisableMvcResponseHeader = t ...

  2. 【问题解决方案】Keras手写数字识别-ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接

    参考:台大李宏毅老师视频课程-Keras-Demo 在载入数据阶段报错: ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接 Google之 ...

  3. PHP eval函数

    代码: eval("echo'hello world';"); 上边代码等同于下边的代码: echo"hello world"; 在浏览器中都输出:hello ...

  4. skynet 源码阅读笔记 bootstrap.lua

    最近几周粗略看了 skynet 代码的 C 部分.遇到很多知识点以前只是知道,但并不十分了解,所以这是一个学习的过程. 从 main 函数开始,闷头一阵看下来,着实蛋疼. 当看了 skynet_mq. ...

  5. eclipse上搭建mybatis

    1..在help中打开 2.搜索mybatipse 3:功能简介 1:要查找某一个方法        在dao接口中某一个方法中 按住 Ctrl键 鼠标指到方法名称上 选择open xml 就会自动跳 ...

  6. vue路由router的三种传参方式

    方法三: 传参页面传递参数方式: this.$router.push({ path: 'indexTwoDetails', query: { "id": id } }) 接受参数页 ...

  7. windows10升级系统后,无法远程桌面连接服务器

    远程桌面,身份验证错误:要求的函数不正确等解决办法 https://www.cnblogs.com/LuckWJL/p/9018710.html

  8. CentOS6.7-64bit编译spark-1.6.1和spark-1.3.1

    编译spark-1.6.1 tar -zxvf spark-1.6.1.tgz -C /usr/local/src/ cd /usr/local/src/spark-1.6.1/ #设置内存2G ex ...

  9. Python:SQLMap的工作流程

    流程图 代码解析 后面补充…… 版权 作   者:曾是土木人 新浪微博:http://weibo.com/cstmr 转载请注明出处:http://www.cnblogs.com/hongfei/p/ ...

  10. Feign status 400 reading 问题分析

    背景:项目使用的是微服务架构,采用springboot来开发,所有的服务都是基于内嵌tomcat来运行 问题:项目部署到测试环境之后,偶尔在后台日志会看到这样的日志:Feign status 400 ...