我有一個具有動態 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
orsocat
或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