前情介绍:
最近,需要自己动手部署项目到测试环境。测试环境需要用跳板机登录。于是每天自己在不停的输入ssh命令登录到跳板机和远程测试机器。烦死。敲了一遍又一遍的登录命令,而跳板机还是用名字的,名字却老长老长,记不住。于是,每次登录前,先找到对应的跳板机名称,然后copy到命令里面,然后再去登录。要最终登录到测试机器上,需要做三步:1. 打开记录跳板机地址名称的文件;2.在终端输入ssh登录命令,copy跳板机名称粘贴到终端作为登录命令的参数. 3.在跳板机器上再输入一遍命令登录到目标机器上。花去的时间不说,问题是自己老在做这个重复没有技术含量的动作。很显然,我要自动化。脚本,不就是干这个事情吗?OK,我决定写一个登录到目标机器的脚本。
脚本第一稿:
登录的命令其实很简单,不就是“ssh -i ${cert-file} ${target_machine}” 吗?敲两个命令就好,但于我前面介绍的的原因,这两个命令敲的快不了。因此,一开始的想法就是把这两条命令放在sh脚本中执行即可。于是,第一稿出炉,格式如下:
#!/bin/sh
TARGET_MACHINE=$1
board_machine=$2
local-cert-file=$3
board-cert-file=$4
echo "you input target machine:" $TARGET_MACHINE
echo "you input machine profile:" $local-cert-file
sudo ssh -i ${local-cert-file} ${board_machine} "ssh -i ${board-cert-file} $TARGET_MACHINE"
执行,发现出来错误:
Pseudo-terminal will not be allocated because stdin is not a terminal
发现这事伪终端问题。于是,添加选项-tt解决。最后一句话成这样:
sudo ssh -i ${local-cert-file} ${board_machine} "ssh -i -tt ${board-cert-file} $TARGET_MACHINE"
然后chmod +x login.sh,再执行./login.sh 10.0.1.9 xxxxxx#@longboardmachinename ./local-certfile /home/board-certfiledir/board-certiflename。 ok,顺利登录到目标机器10.0.1.9了。虽然正常工作了,可是这4个参数要敲这么长,根本没有改进啊,还是会烦死。。。不行,还得改进;
脚本第二稿:
因为跳板机的名称是不变的,因此完全可以写死在脚本里面啊。而且因为本地和跳板机的certfile名称完全一致,都是形如xxx_cert.pem的格式,xxx是对应的测试环境标记,因此改写如下:
#!/bin/sh
TARGET_MACHINE=$1
PROFILE=$2
echo "you input target machine:" $TARGET_MACHINE
echo "you input machine profile:" $PROFILE
echo "Begin to login target machine......"
board-certfile="/home/certfiledir/${PROFILE}_cert.pem"
echo "pem:" ${board-certfile}
sudo ssh -i ${PROFILE}_cert.pem #longboardmachinename# "ssh -tt -i ${board-certfile} $TARGET_MACHINE"
此时,就只要输入2个参数了,键入: ./login.sh 10.0.1.9 test,这样就用到测试的认证文件登录到目标机器上了。只需要记录下要登录的目标机器和认证文件的标记即可。此时,我突然只想登录到跳板机上,这个又不适用了。。。于是,再改。
脚本第三稿:
添加选项,采用if分支。如果只想登录到跳板机,就把第一个target-machine的名称写成“board”,发现是“board”,则只登录到跳板机就行。添加if后的写法如下:
#!/bin/sh
TARGET_MACHINE=$1
PROFILE=$2
echo "you input target machine:" $TARGET_MACHINE
echo "you input machine profile:" $PROFILE
if [ $TARGET_MACHINE = "board" ];then
echo "Begin to login board machine......"
sudo ssh -i ${PROFILE}_cert.pem #longboardmachinename#
elif [ $TARGET_MACHINE ];then
echo "Begin to login target machine......"
board-certfile="/home/certfiledir/${PROFILE}_cert.pem"
echo "pem:" ${board-certfile}
sudo ssh -i ${PROFILE}_cert.pem #longboardmachinename# "ssh -tt -i ${board-certfile} $TARGET_MACHINE"
else
echo "Usage: login.sh [target_machine] [profile(test|release|]."
echo " [target_machine]: the ip of the machine or 'board' if you only want to login the board machine"
fi
此时,就支持只登录到跳板机的任务了。只需输入:./login.sh board test即可。
最终,这个脚本执行时,只要输入你要登录的目标机器和认证文件标记即可。只要一步,时间1s 搞定。