├── .gitignore ├── README.md ├── data └── ssh.dat ├── exp ├── direct.exp └── step.exp ├── images ├── 1541678825141.gif ├── 1541679098732.gif ├── Xnip2019-07-12_00-47-14.jpg ├── Xnip2019-07-12_00-53-08.jpg └── Xnip2019-07-12_01-13-51.jpg └── ssh-tools.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ssh-tools 2 | 3 | ![](https://img.shields.io/badge/lanauage-%E4%B8%AD%E6%96%87-brightgreen.svg)[![](https://img.shields.io/badge/platform-linux/MacOS-brightgreen.svg)]()[![release](https://img.shields.io/badge/release-v0.1-orange.svg)]()[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) 4 | 5 | > 一款为方便mac以及类unix使用ssh以及ssh跳板机的一个shell小工具 6 | 7 | 使用说明: 8 | 9 | 1. 克隆或者下载该项目 10 | 11 | ```bash 12 | git clone git@github.com:lonecloud/ssh-tools.git 13 | ``` 14 | 15 | 2. 配置ssh.dat 16 | 17 | 说明一下这几个的参数 18 | 19 | 1. 机器类型范围值:0 直接连接机器,1. 跳板机 2.目标机 20 | 2. ssh中的用户名以及IP(设置端口,非必填): eg:username@ip [:port] 21 | 3. 密码 22 | 4. 备注,非必填选项 23 | 24 | ```bash 25 | 0 root@192.168.209.10:2315 123456 这个是直连机器 26 | 1 root@192.168.209.11 123456 这个是跳板机器 27 | 2 root@192.168.209.12:223 123456 这个是通过跳板后的目标机器 28 | 0 root@192.168.209.13 123456 29 | ``` 30 | 31 | 操作指引图片: 32 | 33 | 直连: 34 | 35 | ![直连操作](images/1541678825141.gif) 36 | 37 | 跳板机: 38 | 39 | ![跳板机](images/1541679098732.gif) 40 | 41 | iterm2配置: 42 | 43 | ⌘ + o 打开配置文件 44 | 45 | ![iterm2](images/Xnip2019-07-12_00-47-14.jpg) 46 | 47 | 设置好相应的信息即可 48 | 49 | ⌘ + o 打开配置文件 50 | 51 | ![iterm2](images/Xnip2019-07-12_00-53-08.jpg) 52 | 53 | 双击配置文件即可打开! 54 | 55 | ![iterm2](images/Xnip2019-07-12_01-13-51.jpg) 56 | 57 | 58 | 59 | 60 | ## 未待完续,欢迎Fork and star 61 | 62 | github地址:https://github.com/lonecloud/ssh-tools 63 | 64 | 码云地址:https://gitee.com/lonecloud/ssh-tools 65 | 66 | 67 | 68 | 欢迎大家提出宝贵的意见以及建议,请大家在issue提出哈 69 | -------------------------------------------------------------------------------- /data/ssh.dat: -------------------------------------------------------------------------------- 1 | 0 root@192.168.209.10 123456 直连机器1 2 | 1 root@192.168.209.11 123456 跳板机 3 | 0 root@192.168.209.12 123456 4 | 2 root@192.168.209.13 123456 目标机2 5 | -------------------------------------------------------------------------------- /exp/direct.exp: -------------------------------------------------------------------------------- 1 | #!/bin/expect 2 | set ip [lindex $argv 0 ] 3 | set port [lindex $argv 1] 4 | set passwd [lindex $argv 2 ] 5 | set timeout 10 6 | spawn ssh $ip -p $port 7 | expect { 8 | "*yes/no" { send "yes\r"; exp_continue} 9 | "*assword:" { send "$passwd\r" } 10 | } 11 | expect "*@*" 12 | # 重设 session 的 LC_CTYPE,否则会出现乱码 13 | send "export LC_CTYPE=\${LANG}\r clear\r" 14 | trap { 15 | set rows [stty rows] 16 | set cols [stty columns] 17 | stty rows $rows columns $cols < $spawn_out(slave,name) 18 | } WINCH 19 | interact -------------------------------------------------------------------------------- /exp/step.exp: -------------------------------------------------------------------------------- 1 | #!/bin/expect 2 | set ip [lindex $argv 0 ] 3 | set port [lindex $argv 1] 4 | set passwd [lindex $argv 2 ] 5 | set for_ip [lindex $argv 3 ] 6 | set for_port [lindex $argv 4 ] 7 | set for_pwd [lindex $argv 5 ] 8 | set timeout 10 9 | spawn ssh $ip -p $port 10 | expect { 11 | "*yes/no" { send "yes\r"; exp_continue} 12 | "*assword:" { send "$passwd\r" } 13 | } 14 | expect "*@*" 15 | send "ssh $for_ip -p $for_port\r" 16 | expect { 17 | "*yes/no" { send "yes\r"; exp_continue} 18 | "*assword:" { send "$for_pwd\r" } 19 | } 20 | expect "*@*" 21 | send "clear\r" 22 | trap { 23 | set rows [stty rows] 24 | set cols [stty columns] 25 | stty rows $rows columns $cols < $spawn_out(slave,name) 26 | } WINCH 27 | interact 28 | exit -------------------------------------------------------------------------------- /images/1541678825141.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lonecloud/ssh-tools/382b035068632e3b1f7f265dbcb2e2094c790402/images/1541678825141.gif -------------------------------------------------------------------------------- /images/1541679098732.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lonecloud/ssh-tools/382b035068632e3b1f7f265dbcb2e2094c790402/images/1541679098732.gif -------------------------------------------------------------------------------- /images/Xnip2019-07-12_00-47-14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lonecloud/ssh-tools/382b035068632e3b1f7f265dbcb2e2094c790402/images/Xnip2019-07-12_00-47-14.jpg -------------------------------------------------------------------------------- /images/Xnip2019-07-12_00-53-08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lonecloud/ssh-tools/382b035068632e3b1f7f265dbcb2e2094c790402/images/Xnip2019-07-12_00-53-08.jpg -------------------------------------------------------------------------------- /images/Xnip2019-07-12_01-13-51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lonecloud/ssh-tools/382b035068632e3b1f7f265dbcb2e2094c790402/images/Xnip2019-07-12_01-13-51.jpg -------------------------------------------------------------------------------- /ssh-tools.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | echo 请选择你的机器列表 3 | # define BASE PATH 4 | BASE_PATH=$(dirname "$0") 5 | # 定义数据相关的文件 6 | DATA_FILE=$BASE_PATH/data/ssh.dat 7 | # 定义执行ssh的文件 8 | DIRECT_FILE=$BASE_PATH/exp/direct.exp 9 | STEP_FILE=$BASE_PATH/exp/step.exp 10 | TYPE_ARR=($(awk '{print $1}' $DATA_FILE)) 11 | HOST_ARR=($(awk '{print $2}' $DATA_FILE)) 12 | PASS_ARR=($(awk '{print $3}' $DATA_FILE)) 13 | COMMENT_ARR=($(awk '{print $4}' $DATA_FILE)) 14 | FORWARD_ARR=($(awk 'BEGIN {i=0}{if($1 !~ /^#/) i+=1} END {print $3}' $DATA_FILE)) 15 | FORWARD_ARR=($(awk 'BEGIN {i=0}{if($1 !~ /^#/) i+=1} END {print $4}' $DATA_FILE)) 16 | DEFAULT_TYPE=$1 17 | DEFAULT_SOURCE=$2 18 | DEFAULT_TARGET=$3 19 | TEMP_ADDR="roo@127.0.0.1 22" 20 | # 指定当前 session 的LC_CTYPE,用来解决 sz、rz 失效的问题 21 | export LC_CTYPE=en_US 22 | # def for host 23 | function splitAddr(){ 24 | address=$1 25 | arr=(${address//:/ }) 26 | if [[ ${#arr[@]} -eq 2 ]]; then 27 | TEMP_ADDR="${arr[0]} ${arr[1]}" 28 | else 29 | TEMP_ADDR="${arr[0]} 22" 30 | fi 31 | } 32 | # 用于打印服务器列表 33 | function printList(){ 34 | for (( i = 0; i < $arr_len; i++ )); do 35 | if [[ ${TYPE_ARR[$i]} -eq $1 ]]; then 36 | echo "$i ${HOST_ARR[$i]} ${COMMENT_ARR[$i]}" 37 | fi 38 | done 39 | echo 请输入你需要直接进入的服务器 40 | } 41 | # 直接连接的函数 42 | function direct() 43 | { 44 | if [[ -n $DEFAULT_SOURCE ]]; then 45 | select=$DEFAULT_SOURCE 46 | # using split port 47 | splitAddr ${HOST_ARR[$select]}; 48 | expect $DIRECT_FILE $TEMP_ADDR ${PASS_ARR[$select]} 49 | else 50 | printList 0 51 | read select 52 | if [[ ${arr_len} -gt $select ]]; then 53 | # 直接连接的机器 54 | echo 正在连接服务器 ${HOST_ARR[$select]} 55 | splitAddr ${HOST_ARR[$select]} 56 | expect $DIRECT_FILE $TEMP_ADDR ${PASS_ARR[$select]} 57 | else 58 | echo 输入的数字不正确 59 | fi 60 | fi 61 | } 62 | # 跳板机 63 | function step(){ 64 | if [[ -n $DEFAULT_SOURCE ]]; then 65 | select=$DEFAULT_SOURCE 66 | splitAddr ${HOST_ARR[$select]} 67 | SOURCE_ADDR=$TEMP_ADDR 68 | target=$DEFAULT_TARGET 69 | splitAddr ${HOST_ARR[$target]} 70 | TARGET_ADDR=$TEMP_ADDR 71 | expect $STEP_FILE $SOURCE_ADDR ${PASS_ARR[$select]} ${TARGET_ADDR} ${PASS_ARR[$target]} 72 | else 73 | echo '选择跳板机' 74 | printList 1 75 | read select 76 | if [[ ${arr_len} -gt $select ]]; then 77 | printList 2 78 | read -p "选择目标机:" target 79 | # 直接连接的机器 80 | if [[ ${TYPE_ARR[$target]} -eq 2 ]]; then 81 | splitAddr ${HOST_ARR[$select]} 82 | SOURCE_ADDR=$TEMP_ADDR 83 | splitAddr ${HOST_ARR[$target]} 84 | TARGET_ADDR=$TEMP_ADDR 85 | echo 正在连接服务器 ${HOST_ARR[$select]} 86 | expect $STEP_FILE $SOURCE_ADDR ${PASS_ARR[$select]} $TARGET_ADDR ${PASS_ARR[$target]} 87 | fi 88 | else 89 | echo 输入的数字不正确 90 | fi 91 | fi 92 | } 93 | # fefault type 94 | arr_len=${#HOST_ARR[@]} 95 | if [[ -n $DEFAULT_TYPE ]]; then 96 | type=$DEFAULT_TYPE 97 | else 98 | echo "请选择连接的类型:1直接连接,2 跳板" 99 | read type 100 | fi 101 | case "$type" in 102 | "1") 103 | direct 104 | ;; 105 | "2") 106 | step 107 | ;; 108 | *) 109 | #其它输入 110 | echo "output error,please input 1/2" 111 | ;; 112 | esac 113 | 114 | --------------------------------------------------------------------------------