使用动态 IP 的 ssh 配置

使用动态 IP 的 ssh 配置

我有一个具有动态 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 sshman ssh_config没有很好地解释它。

这能实现吗?

答案1

ProxyCommand 可以替代原始 TCP 连接。它并不能取代整个 SSH 连接 – 尽管您经常看到它用于调用ssh -W,但这仍然只是使用另一个 SSH 系统来提供原始 TCP 隧道。

因此,在您的情况下,ProxyCommand 应该运行一些简单的“TCP 管道”应用程序,例如ncsocatncat- 将 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

相关内容