我需要为一些同事编写一个脚本,以便他们通过以下拓扑进行连接,并使用私钥进行身份验证(每个人的相同密钥适用于堡垒和数据库访问):
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ │ │ │ │ │ │ │
│ desktop │───>│ bastion │────>│ db access │────>│ db 3306 │
│ (windows) │ │ (linux) │ │ (linux) │ │ (mysql) │
└────────────┘ └────────────┘ └────────────┘ └────────────┘
我的同事随后将在桌面数据库查询工具中使用此连接。
为了尽可能简化部署,我想在命令行上指定所有配置,而不引用 Putty UI 中配置的任何已保存会话数据。我有脚本可以引用的私钥的 .ppk 文件。
什么(可能非常长的)putty和/或plink命令行可以实现此功能?
根据我对手册的理解,我尝试这样做:
plink -ssh -2 -i C:\temp\key.ppk -agent -A -t -l user -L 6035:127.0.0.1:6035 user@BASTION ssh -v -L 6035:DBHOST:3306 user@DBACCESS
这会让我进入堡垒,但它会在堡垒上寻找私钥以建立与数据库访问的连接。
我能够从我的 Mac 使用 ssh 连接到它(代码如下所示),所以我知道盒子的当前配置允许这种访问。我正在寻找用于从 Windows 盒子访问的 putty/plink 解决方案。
ssh -v -A -t \
-L ${LOCAL_PORT}:localhost:${LOCAL_PORT} ${USER}@${BASTION_HOST} \
-t ssh -v -L ${LOCAL_PORT}:${DB_HOST}:${DB_PORT} ${USER}@${DB_ACCESS_HOST}
答案1
随着 PuTTY 0.68 的发布,plink
获得了一个名为 的新命令行选项-proxycmd
。使用这个新功能可以得到一个更强大、更简洁的解决方案。
不幸的是,该选项没有太多帮助-proxycmd
。它确实执行本地命令并将其用作代理。甚至可以使用plink
该-nc
选项创建到db access
主机的隧道。
对于您的拓扑,在命令提示符下的机器上执行的命令desktop
如下所示:
plink -A ^
-proxycmd "plink -A -nc DBACCESS:22 user@BASTION" ^
-L 6035:DBHOST:3306 ^
user@DBACCESS
注意:要实现无密码登录,peagent
必须在主机上运行desktop
并加载适当的密钥。正如评论中提到的,必须在主机上启用代理转发bastion
才能使其无缝运行。
连接看起来就像下面的 ASCII 图一样。外部隧道通过代理命令到达主机db access
。封装在隧道中的运行plink
并建立到主机的端口转发db
。
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ │ │ │ │ │ │ │
│ ───────────────────────────── │ │ │
│ (1) │ │ │
│ ──────────────────────────────────────────── │
│ (2) │
│ ──────────────────────────────────────────── │
│ ───────────────────────────── │ │ │
│ desktop │ │ bastion │ │ db access │ │ db 3306 │
│ (windows) │ │ (linux) │ │ (linux) │ │ (mysql) │
└────────────┘ └────────────┘ └────────────┘ └────────────┘
1) Tunnel via `-proxycmd "plink -A -nc DBACCESS:22 user@BASTION"`
2) Proxied `plink` connection with port forward `-L 6035:DBHOST:3306`