簡體   English   中英

SSH ProxyCommand 使用 aws SSM session 管理器和 bash 腳本與 select 命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM