先看一下效果 選擇分組 選擇伺服器 <! 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