當需要多級代理到某臺機器上,又不希望在每一臺機器上搭建繁瑣的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個參數均爲數組,跳板順序以數組下標遞增,四個參數對應配置就可以
jumpHostArr
:服務器的域名或者IP地址jumpPortArr
: 服務器的開放的SSH端口號jumpUserArr
: 對應服務器的用戶jumpPassAesArr
: 服務器的密碼
代碼量不大,直接看吧~
#!/bin/bash
##############################################################
# Copyright (c) 2020 by w0x21. All Rights Reserved.
#
# Filename: jumpPorxy.sh
# Author:w0x21
# Email: [email protected]
# 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
ps:計劃後續改爲json可配置文件的形式,今天剛剛寫完,迫不及待的想發佈了
如有問題,歡迎留言諮詢