环境:本机(MacOS)->跳板机(Linux)->目标服务器(Linux)
手册:expect
说明:核心在于自动输入双因素码,可用oathtool、ga-cmd等工具配置SECRET以命令行方式获取码值,测试发现需要sleep下,否则可能send异常导致无法自动连接。
代码:
#!/usr/bin/expect -f
#
#Usage: $0 <prod server ip>
#
# 跳板机 ip
set TERMSERV 跳板机IP
# 通过跳板机才能访问的目标主机 ip
set host [lindex $argv 0]
# 统一用户名
set USER 跳板机与目标服务器用户统一了(可以具体分开)
# 登录跳板机
spawn ssh -l $USER -o StrictHostKeyChecking=no $TERMSERV
sleep 1
expect "*assword:*" { send "跳板机密码\r" }
sleep 2
expect "*verification code"
sleep 1
set code [exec sh -c {oathtool --totp --base32 跳板机双因素SECRET}]
send "$code\r"
if {$host != ""} {
# 登录内网
sleep 1
expect "*$USER@*" {send "ssh -o StrictHostKeyChecking=no -l $USER $host\r"}
sleep 1
expect "*assword:*" { send "目标服务器密码\r" }
}
interact
使用:
上述代码把非注释的中文部分(IP、密码、SECRET)按照实际替换,保存成文件,chmod +x
赋予文件可执行权限,
可以配置成 alias 或放到 $PATH
下,直接执行即登录跳板机/堡垒机,
如果携带 ip 作为参数则登录到跳板机/堡垒机后会再 ssh 连接到目标机器。
附录: