選擇分組
選擇服務器
jquery
開始連接
git
以前寫過一個字符界面的連接工具,可是看起來比較簡陋,他是這個樣子的:
看起來十分很差看。後來在網上看到shell中有一個whiptail工具能夠製做各類命令行裏的工具,因而就搜索了一下教程,而後就將以前的ssh工具從新寫了一下。github
這裏我只用到了whiptail的菜單欄和提示框,因此這裏就只說這兩種用法:
1:菜單框
語法:shell
whiptail --menu 菜單名稱 高 寬 顯示多少條 [標示 菜單項] ...
例子:json
whiptail --menu 這是一個菜單 15 30 2 1 菜單一 2 菜單二
2: 提示框
語法:數組
whiptail --msgbox 消息信息 高 寬
例子:bash
whiptail --msgbox 這是消息框 10 20
有這兩個框框,就已經能夠知足個人需求啦,如今就能夠寫了服務器
以前寫的配置文件看起來不是很清晰,添加起來比較容易出錯,如今我使用json格式的文件來保存多個ssh的配置,它看起來是這樣的:ssh
[{ "name": "何白白", "server": [{ "name": "騰訊", "ip": "127.0.0.1", "user": "用戶名", "pwd": "密碼" }] }]
用的是一個數組,每個數組表明一個分組,name是分組信息,server是這個組裏的ssh配置,能夠有多個。
如今配置文件寫完了,咱們看一下怎麼在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
如今基本的操做方法也有了,如今開始寫功能吧
這裏咱們須要將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