使用whiptail寫linux字元介面ssh連結工具2.0

何白白發表於2019-03-04

先看一下效果

選擇分組

使用whiptail寫linux字元介面ssh連結工具2.0
選擇伺服器

使用whiptail寫linux字元介面ssh連結工具2.0

開始連結

使用whiptail寫linux字元介面ssh連結工具2.0

為什麼寫

之前寫過一個字元介面的連結工具,但是看起來比較簡陋,他是這個樣子的:

使用whiptail寫linux字元介面ssh連結工具2.0
看起來十分不好看。後來在網上看到shell中有一個whiptail工具可以製作各種命令列裡的工具,於是就搜尋了一下教程,然後就將之前的ssh工具重新寫了一下。

whiptail 簡單介紹

這裡我只用到了whiptail的選單欄和提示框,所以這裡就只說這兩種用法: 1:選單框 語法:

whiptail --menu 選單名稱 高 寬 顯示多少條 [標示 選單項] ...
複製程式碼

例子:

whiptail --menu 這是一個選單 15 30 2 1 選單一 2 選單二
複製程式碼

使用whiptail寫linux字元介面ssh連結工具2.0
2: 提示框 語法:

whiptail --msgbox 訊息資訊 高 寬
複製程式碼

例子:

whiptail --msgbox 這是訊息框 10 20
複製程式碼

使用whiptail寫linux字元介面ssh連結工具2.0
有這兩個框框,就已經可以滿足我的需求啦,現在就可以寫了

寫ssh的配置檔案

之前寫的配置檔案看起來不是很清晰,新增起來比較容易出錯,現在我使用json格式的檔案來儲存多個ssh的配置,它看起來是這樣的:

[{
    "name": "何白白",
    "server": [{
        "name": "騰訊",
        "ip": "127.0.0.1",
        "user": "使用者名稱",
        "pwd": "密碼"
    }]
}]
複製程式碼

用的是一個陣列,每一個陣列代表一個分組,name是分組資訊,server是這個組裡的ssh配置,可以有多個。 現在配置檔案寫完了,我們看一下怎麼在shell裡解析json

在shell指令碼中解析json

這裡我是用用 jq 這個工具來做的,當然這個jq 不是 jquery。它的官網在這裡 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

相關文章