使用whiptail寫linux字元界面ssh鏈接工具2.0

来源:https://www.cnblogs.com/hebaibai/archive/2019/03/04/10472109.html
-Advertisement-
Play Games

先看一下效果 選擇分組 選擇伺服器 <! more 開始鏈接 為什麼寫 之前寫過一個字元界面的鏈接工具,但是看起來比較簡陋,他是這個樣子的: 看起來十分不好看。後來在網上看到shell中有一個 whiptail 工具可以製作各種命令行里的工具,於是就搜索了一下教程,然後就將之前的ssh工具重新寫了一 ...


先看一下效果

選擇分組

選擇伺服器

開始鏈接

為什麼寫

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

看起來十分不好看。後來在網上看到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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vscode近來深受的開發人員的喜愛。在下的前端同事們也紛紛使用vscode。在下就想了我等後端程式員也可以用vscode寫C#代碼。畢竟是從宇宙第一IDE Visual Studio衍生的不是。 就先從控制台開始。 1.首先要安裝.net core sdk https://www.microsof ...
  • 生產環境中我們往往會遇到以多個郵箱別名結尾的情況,如何快速導出當前域用戶郵箱以某欄位或尾碼結尾的用戶列表信息變得尤為重要,本例簡單彙總下如何通過Powershell快速篩選出當前郵箱信息包含azureyun.com的用戶列表並導出。實例如下:Get-ADUser -Filter * -SearchB... ...
  • 小技巧一例,批量刪除Visual Studio code或notepad++註解信息,便於讀取有效代碼或文本信息,具體操作如下:Visual Studio Code批量刪除註解行信息:在VS Code中我們可以通過Ctrl+h快捷鍵調出替換界面,在替換查找界面輸入空行對應的正則表達式^#.*並Alt... ...
  • 查看路由表 永久添加路由 重啟網路生效 ...
  • Windows 下Filebeat排錯Case實例一份,請查收。問題描述:Windows Server下Filebeat Agent服務無法正常啟動,導致網路數據打點無法正常進行,影響大範圍用戶網路使用等;報錯信息如下:查看對應log文件,日誌信息如下:2019-03-04T11:38:14+08:... ...
  • 協議 可理解為規則,是數據傳輸和數據解釋的規則。 TCP協議註重數據的傳輸,http協議註重數據的解釋 傳輸層:常見協議有TCP/UDP協議 應用層:常見協議有HTTP協議,FTP協議。 網路層:常見協議有ARP協議,RARP協議。 網路介面層:常見協議有ARP協議,RAPP協議。 HTTP 超文本 ...
  • windows防火牆實驗-設置遠程桌面連接以及禁止瀏覽器上網 實驗環境: 1.win2008遠程桌面服務 2.win7-1 10.10.10.136 3.win7-2 10.10.10.153 實驗步驟: 一、設置防火牆規則關於遠程桌面連接的 1.關閉防火牆中遠程桌面的規則 #或者直接在現有的遠程桌 ...
  • linux基礎之用戶及組管理 1、前序 對有限區域內,有限資源的合規使用的3A標準 Authentication:認證 相當於拿到了一個登錄linux的賬號,這叫認證了,但是這不表明拿到一個賬號你就能為所欲為,還需要進行授權 Authorization:授權 任何一個系統,認證完以後都有系統指派的一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...