使用whiptail寫linux字符界面ssh連接工具2.0

先看一下效果

選擇分組

選擇服務器
jquery

開始連接
git

爲何寫

以前寫過一個字符界面的連接工具,可是看起來比較簡陋,他是這個樣子的:

看起來十分很差看。後來在網上看到shell中有一個whiptail工具能夠製做各類命令行裏的工具,因而就搜索了一下教程,而後就將以前的ssh工具從新寫了一下。github

whiptail 簡單介紹

這裏我只用到了whiptail的菜單欄和提示框,因此這裏就只說這兩種用法:
1:菜單框
語法:shell

whiptail --menu 菜單名稱 高 寬 顯示多少條 [標示 菜單項] ...

例子:json

whiptail --menu 這是一個菜單 15 30 2 1 菜單一 2 菜單二


2: 提示框
語法:數組

whiptail --msgbox 消息信息 高 寬

例子:bash

whiptail --msgbox 這是消息框 10 20


有這兩個框框,就已經能夠知足個人需求啦,如今就能夠寫了服務器

寫ssh的配置文件

以前寫的配置文件看起來不是很清晰,添加起來比較容易出錯,如今我使用json格式的文件來保存多個ssh的配置,它看起來是這樣的: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

相關文章
相關標籤/搜索