Linux shell 实现多服务器SSH一键代理脚本发布时间:2020/10/14 14:33:18 阅读次数:

  

 

       当需要多级代理到某台机器上,又不希望在每一台机器上搭建繁琐的proxy工具时,这个脚本可以很方便的实现

       比如当需要SSH连接到目标服务器T,但是出于网络原因,只能通过 `ServerA->ServerB->ServerC->T` 这样的路径去连接到目标服务器T时,如果每次都需要 ssh 到每一台机器,是非常头疼的事情。

       这个脚本需要使用到两个工具

  • nc (netcat) - 用于端口转发

  • sshpass - 用于自动登陆到跳板服务器

       非常有意思的是编写这个脚本时用了一个黑魔法端口转发的方式,详见代码中的 `$comArr` 赋值处。

       为了防止密码以明文的方式出现在脚本中,特意做了AES加密处理,在配置`jumpPassAesArr`参数之前,首先使用以下指令,生成对应跳板服务器密码的AES密文

echo -n "{password}" | openssl enc -aes-128-ecb -a -e -pass pass:"{decrypt key}" -nosalt -pbkdf2

       需要配置的参数总共4个,4个参数均为数组,跳板顺序以数组下标递增,4个参数对应配置就可以

jumpHostArr : 服务器的域名或者IP地址

jumpPortArr : 服务器的开放的SSH端口号

jumpUserArr : 对应服务器的用户

jumpPassAesArr : 服务器的密码

 

       直接看代码

#!/bin/bash

##############################################################

#    Copyright (c) 2020 by w0x21. All Rights Reserved.

#   

#    Filename: jumpPorxy.sh

#    Author:w0x21

#    Email: w0x0021@gmail.com

#    Create time: Wed 01 Jul 2020 05:33:00 PM PDT

#   

#    Description:

##############################################################

# Default configure

BindPort=10022

DefaultSleepTime=1

##########################

# Target's information

##########################

TargetHost="target host"

TargetPort=22

##########################

# Jump host's information

##########################

jumpHostArr=("Host1" "Host2" "Host3")

jumpPortArr=(22 22 22)

jumpUserArr=("root" "root" "root")

########################################################################################################

# run `echo -n "password" | openssl enc -aes-128-ecb -a -e -pass pass:"decrypt key" -nosalt -pbkdf2`   #

########################################################################################################

jumpPassAesArr=("AES(Password1)" "AES(Password1)" "AES(Password1)")

jumpPassArr=()

###################

# Decrype password

###################

let index=0

read -p "Please enter AES key: " aes_key

for aes_pass in "${jumpPassAesArr[@]}"

do

    jumpPassArr[$index]=`echo "$aes_pass" | openssl enc -aes-128-ecb -a -d -pass pass:"$aes_key" -nosalt -pbkdf2`

    let index+=1

done

######################

# Build command array

######################

comArr=()

let index_max=${#jumpHostArr[*]}-1

for index in $(seq 0 $index_max)

do

    let index_next=index+1

    if [ x"$index" == x"$index_max" ]; then

        comArr[$index]="nohup nc -l $BindPort >& /dev/tcp/$TargetHost/$TargetPort 0>&1 & sleep $DefaultSleepTime"

    else

        comArr[$index]="nohup nc -l $BindPort >& /dev/tcp/${jumpHostArr[$index_next]}/$BindPort 0>&1 & sleep $DefaultSleepTime"

    fi

done

###################

# Build command

###################

runCom=""

let index_max=${#jumpHostArr[*]}-1

for index in $(seq $index_max -1 0)

do

    loginCom="sshpass -p \"${jumpPassArr[$index]}\" ssh -o StrictHostKeyChecking=no -p ${jumpPortArr[$index]} ${jumpUserArr[$index]}@${jumpHostArr[$index]}"

    runCom="$loginCom \"\$(echo \"`echo \"$runCom${comArr[$index]}\"|base64 -w 0`\"|base64 -d)\";"

done

echo $runCom

echo ""

###################

# Start proxy

###################

bash -c "$runCom"

echo "----------"

if [ $? == 0 ]; then

    echo "Proxy execution succeeded, please connect \"${jumpHostArr[0]}:$BindPort\""

else

    echo "Proxy execution fail."

fi