У меня есть экземпляр EC2 с динамическим IP-адресом, и я хотел бы подключиться к нему напрямую, не изменяя его .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 pipe», например, или nc
– подойдет все, что подключает stdin/stdout к TCP-соединению:socat
ncat
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