[英]SSH ProxyCommand using aws SSM session manager and bash script with select command
在我的公司,當我們 SSH 到我們的 AWS EC2 實例時,我們需要使用 aws CLI session-manager 插件進行身份驗證。 使用此 SSH 配置片段有效:
Host my-aws-host
ProxyCommand bash -c "aws ssm start-session --target 'i-0abc123def456hij' \
--document-name AWS-StartSSHSession --parameters 'portNumber=22' \
--region us-west-1 --profile MAIN"
但是,當 EC2 實例重新啟動時(這種情況半定期發生),“目標”實例 ID 會發生變化。 發生這種情況時,所有用戶都需要使用新 ID 更新其 SSH 配置。 不幸的是,我們沒有任何類型的 DNS 可以將這些實例解析為 static 主機名,因此需要以某種方式將新實例 ID 發布給所有感興趣的用戶。
因此,我編寫了一個 bash 腳本 ( ssh_proxy_command.sh
),它首先查詢我們的 AWS 賬戶以根據已知標簽值獲取當前實例 ID,並將其用於目標——這是一個簡化版本:
#!/bin/bash
INSTANCE_ID=$(aws ec2 describe-instances --region us-west-1 \
--filters Name=tag:Name,Values=my-server-nametag* \
--query "Reservations[*].Instances[*].{Instance:InstanceId}" --output text)
aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartSSHSession --parameters 'portNumber=22' --region us-west-1 --profile MAIN
現在 SSH 配置看起來像
Host my-aws-host
ProxyCommand bash -c "/path/to/my/ssh_proxy_command.sh %h"
這一直很好用。 但是,我們剛剛開始運行從相同的基礎映像 (AMI) 構建的多個實例,它們使用相同的標簽等,因此給定的 describe-instances 查詢現在返回多個實例 ID。 因此,我嘗試將查詢返回的 output 包裝在 bash select
循環中,認為我可以為用戶提供實例 ID 列表,讓他們選擇他們想要的。 這在直接運行腳本時有效,但在用作 ProxyCommand 時無效。 在后一種情況下,當它到達select
語句時,它會按預期打印出選項,但不會等待用戶輸入 - 它只是直接使用空 $INSTANCE_ID 變量繼續到腳本末尾,這使得aws ssm
命令失敗。
我猜這是 SSH 運行其 ProxyCommands 方式的副作用——來自ssh_config
手冊頁:
[代理命令] 使用用戶的 shell 'exec' 指令執行 [...]
我希望我能找到解決這個問題的方法,同時仍然使用 SSH 配置和 ProxyCommand,而不是求助於ssh
可執行文件周圍的完整獨立包裝器並要求每個人都使用它。 任何建議感激地接受...
host my-aws-host
ProxyCommand aws ssm start-session --target $(aws ec2 describe-instances --filter "Name=tag:Name,Values=%h" --query "Reservations[].Instances[?State.Name == 'running'].InstanceId[]" --output text) --document-name AWS-StartSSHSession --parameters portNumber=%p
以上將根據提供的主機名 (%h) 動態過濾您的目標 ID,以便您可以使用ssh my-aws-host
登錄。 我個人在 AWS 中為我的所有機器設置了一個前綴,因此我的 ssh 配置如下:
host your-custom-prefix-*
ProxyCommand aws ssm start-session --target $(aws ec2 describe-instances --filter "Name=tag:Name,Values=%h" --query "Reservations[].Instances[?State.Name == 'running'].InstanceId[]" --output text) --document-name AWS-StartSSHSession --parameters portNumber=%p
只有當您在 AWS 中的機器名稱與提供的主機名匹配時,這才有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.