我有一个具有动态 IP 的 EC2 实例,我想直接连接到它,而不必在.ssh/config
每次更改时进行修改。
我可以使用以下方式查询 IP
aws ec2 describe-instances --filters 'Name=tag:Name,Values=MYTAG' --query 'Reservations[0].Instances[0].NetworkInterfaces[0].Association.PublicIp' --output text
现在,我想将此命令添加到ProxyCommand
我的.ssh/config
文件部分,但出现了一些错误。
这是该主机的部分
Host ec2-instance
User ubuntu
IdentityFile my/pem/file.pem
ProxyCommand bash -c "host=$(aws ec2 describe-instances --filters 'Name=tag:Name,Values=MYTAG' --query 'Reservations[0].Instances[0].NetworkInterfaces[0].Association.PublicIp' --output text); ssh ${host}"
说实话,我不知道这个ProxyCommand
选项是如何工作的,而且似乎man ssh
也man ssh_config
没有很好地解释它。
这能实现吗?
答案1
ProxyCommand 可以替代原始 TCP 连接。它并不能取代整个 SSH 连接 – 尽管您经常看到它用于调用ssh -W
,但这仍然只是使用另一个 SSH 系统来提供原始 TCP 隧道。
因此,在您的情况下,ProxyCommand 应该运行一些简单的“TCP 管道”应用程序,例如nc
或socat
或ncat
- 将 stdin/stdout 附加到 TCP 连接的任何程序都可以:
Host ...
ProxyCommand bash -c "host=...; nc $host %p"
Host ...
ProxyCommand bash -c "host=...; socat STDIO TCP:$host:%p"
我真的建议将所有复杂的内容从 ~/.ssh/config 移到单独的脚本中,这样您的配置看起来就像这样:
Host ...
ProxyCommand ~/bin/ec2-connect %h %p