只要是一家互联网公司,服务器肯定不会少于两台。稍微大一点的,还会有专用的跳板机(堡垒机)作为服务器的跳板。再大一点的,甚至有多台跳板机,几十台服务器。通常的开发拿到这些服务器或跳板机的信息时,都是下载类似SecretCRT的终端软件去登录的,因为这些软件可以保存密码,保存登录所需要的信息。但是作为一名有要求的开发人员,这真的足够方便吗?先要找到这个软件的图标,双击点开,然后找到这个服务器,双击链接上去。好吧,其实也算不上很麻烦,只是不够Geek罢了。
一个酷的程序员会怎么做?快捷键Option+Space呼出命令行终端,敲下
1 | jump-servers a1 |
一般开发来说,命令行终端是始终打开的,其次使用过得命令是有记录的,所以通常键盘敲两下就可以了。对比点击GUI来说,这个才是程序员的打开方式。下面就来教大家怎么写这个命令(不想从头写可以直接跳到最后一节下载源码修改使用)。
主命令jump-servers
用sh命令的case语句控制使用哪个跳板机。语法如下,1
2
3
4
5
6
7
8
9
10
11case $变量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认执行的命令序列
;;
esac
很容易的看出来,变量名就是我们输入的命令参数,命令序列就是对应执行的服务器(跳板机登录)命令。完整的文件如下,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#!/bin/sh
case $1 in
s1 | server1)
echo server1
server1
;;
s2 | server2)
echo server2
server2
;;
s3 | server3)
echo server3
server3
;;
s4 | server4)
echo server4
server4
;;
*)
echo not match server! s1/s2/s3/s4
esac
$1是匹配输入命令时中第一个参数。对应的匹配名,服务器配置文件server1可以自定义。
服务器配置文件servers
上面主命令控制具体执行哪里机的命令后,对应执行登录命令。下面的例子是私钥需要对应输入密码的情况(若不需要,可以跳过以下内容)。因为命令需要输入密码进行交互,所以要用到 #!/usr/bin/expect 。
完整例子:1
2
3
4
5
6
7#!/usr/bin/expect
set timeout 3
spawn ssh -i ~/.ssh/server1.pem username@127.0.0.1 -p 2222
expect "*passphrase*"
send "yourpassword\r"
interact
- expect 是监听命令行中出现的字符
- send 监听到对应字符后,发送字符
后续
假如所有登录方式都是类似可以抽象的,可以把所有服务器信息写到一个配置文件中,然后对应控制匹配,最后传到登录命令中。这样修改添加命令就非常方便了。程序员就是要多动手解决重复的事情,因为这样可以“更懒”。
源码
跳板机登录通用命令-Zack-Ku/jump-servers
适用对象:win10(powershell),linux,macOS。非以上系统,可以回顾上面教程写出类似的命令。
使用方法:
- 打开server1/2/3/4文件
- 修改里面的私钥路径 ~/.ssh/server1.pem
- 修改跳板机登录名 username
- 修改跳板机ip以及端口 127.0.0.1 ,2222
- 在send的那名命令中,修改私钥对应的密码 yourpassword
- 若秘钥对应无密码,删除expect那行开始的剩余代码