环境:本机(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 连接到目标机器。

附录:


·End·