Ubuntu环境下通过SSM访问AWS实例并创建可执行文件故障求助
问题描述
在本地Ubuntu机器上创建了包含以下命令的可执行文件,但运行时程序在执行aws ssm start-session命令后停止,后续命令无法执行;但直接在CLI中逐行粘贴这些命令却能正常完成所有操作。
命令内容如下:
export AWS_ACCESS_KEY_ID="ASIASHIYHNRJMIE52OP2" export AWS_SECRET_ACCESS_KEY="Zlmki7fOg3XLWYQYRp55mylgiuffCJbsMh0c2upu" export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEOH//////////wEaCXVzLWVhc3QtMSJHMEUCIQCsuuLiCr/hAzMMDBeI7veb5mRRaTDph8MpmXUacs6pFPbSgIgMCwgSxdwzPZTSJkmEnm4Oaavozz3xrBqVLwiRzQRh6QqqgMImf//////////ARAAGgwxNTMwNTkwMjgwNTAiDM7dlNKEORNon4QnTSr+AleIWt0EBxM5lWHraEDvaGdlG4ocAE4cADKDfX6blILhUC5FWaWfMaYaAvKgT23hJ8wUPyHjlortb8oOeEwl0bW4XD6S6kis9Gi1g5D6DDJlrjgKfoLrLkHL5XJ7QabkbmNf6xs5mUuwW6nI6vSR6aXlih3zjgLp30Aivo+ubrj2lo4Lm+nQPfR5mop7JTHQpTzbh/zqgLpFgdso+86jI1KcRRHJxEKfbArPzv38yfFkZtGyFGfX+hETnZ1c9GQCilKzhq7Bz60oopC0JrsKZ6U9cMfTGwF7kNd31G9/T7mupsq540VYT6fj43w0VKCcf8bJbBGbYed5OsKf5vfLV+nCOf2sFwlaa8mwnqcS95uiG59gF9y9Mma4bT6wLwqjBrjB3Xo1lYu/IuQiFPfT9XAZ0L42z/AEcBIa6EEtOjGkeSLtT8u6hoYMqPrg1pzM52Ckd/6OlAvkJuISBLAreweSysgPyhVGG7TKTvQL4ULGxUt8BNJIIWO88NN/OfcwzdTomQY6pgEvA14o3xY4nAzpRqWeanbaiiQmw/lXTvZIatggoEM7oe1TX/sD2iB2gir+5HQxO4ZMC5c0xy8XlkcWYidEjuLrlLZ6Bz9m3jWf0uNavwts20IRUf71maLlAFJ8ozWKqtt71c+62/K8cL/f3u/FXE9NdXnr7q+oCxtWUiemw0EOtmUWGwCLOKBrNVJk+zyFVxtA/3stl4dSCj1Ve9L+t5upZvfoBbIH" aws ssm start-session --target i-0fac71837dd267123 sudo -i sudo apt-get update sudo apt install curl -y sudo apt install -y default-jdk
原因分析
aws ssm start-session是交互式会话命令,执行后会直接进入远程AWS实例的shell环境,此时本地脚本会暂停执行,直到你手动退出这个远程会话,后续的sudo -i、apt等命令才会开始执行——但这些命令会在本地Ubuntu机器上运行,而不是你期望的远程实例上。
直接粘贴CLI执行时,你是在进入远程会话后手动输入后续命令,所以这些命令会在远程实例上生效,和脚本的执行逻辑完全不同。
解决方案
方案1:使用aws ssm send-command批量远程执行命令
这是最适合自动化场景的方式,无需进入交互式会话,直接在远程实例上执行指定命令:
export AWS_ACCESS_KEY_ID="ASIASHIYHNRJMIE52OP2" export AWS_SECRET_ACCESS_KEY="Zlmki7fOg3XLWYQYRp55mylgiuffCJbsMh0c2upu" export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEOH//////////wEaCXVzLWVhc3QtMSJHMEUCIQCsuuLiCr/hAzMMDBeI7veb5mRRaTDph8MpmXUacs6pFPbSgIgMCwgSxdwzPZTSJkmEnm4Oaavozz3xrBqVLwiRzQRh6QqqgMImf//////////ARAAGgwxNTMwNTkwMjgwNTAiDM7dlNKEORNon4QnTSr+AleIWt0EBxM5lWHraEDvaGdlG4ocAE4cADKDfX6blILhUC5FWaWfMaYaAvKgT23hJ8wUPyHjlortb8oOeEwl0bW4XD6S6kis9Gi1g5D6DDJlrjgKfoLrLkHL5XJ7QabkbmNf6xs5mUuwW6nI6vSR6aXlih3zjgLp30Aivo+ubrj2lo4Lm+nQPfR5mop7JTHQpTzbh/zqgLpFgdso+86jI1KcRRHJxEKfbArPzv38yfFkZtGyFGfX+hETnZ1c9GQCilKzhq7Bz60oopC0JrsKZ6U9cMfTGwF7kNd31G9/T7mupsq540VYT6fj43w0VKCcf8bJbBGbYed5OsKf5vfLV+nCOf2sFwlaa8mwnqcS95uiG59gF9y9Mma4bT6wLwqjBrjB3Xo1lYu/IuQiFPfT9XAZ0L42z/AEcBIa6EEtOjGkeSLtT8u6hoYMqPrg1pzM52Ckd/6OlAvkJuISBLAreweSysgPyhVGG7TKTvQL4ULGxUt8BNJIIWO88NN/OfcwzdTomQY6pgEvA14o3xY4nAzpRqWeanbaiiQmw/lXTvZIatggoEM7oe1TX/sD2iB2gir+5HQxO4ZMC5c0xy8XlkcWYidEjuLrlLZ6Bz9m3jWf0uNavwts20IRUf71maLlAFJ8ozWKqtt71c+62/K8cL/f3u/FXE9NdXnr7q+oCxtWUiemw0EOtmUWGwCLOKBrNVJk+zyFVxtA/3stl4dSCj1Ve9L+t5upZvfoBbIH" aws ssm send-command \ --targets "Key=instanceids,Values=i-0fac71837dd267123" \ --document-name "AWS-RunShellScript" \ --parameters 'commands=["sudo apt-get update", "sudo apt install curl -y", "sudo apt install -y default-jdk"]' \ --output text
执行后可通过返回的CommandId,配合aws ssm list-command-invocations查看执行结果。
方案2:用非交互式模式通过start-session传递命令
如果必须使用start-session,可以结合--document-name AWS-StartInteractiveCommand传递要执行的命令,执行完成后自动退出会话:
export AWS_ACCESS_KEY_ID="ASIASHIYHNRJMIE52OP2" export AWS_SECRET_ACCESS_KEY="Zlmki7fOg3XLWYQYRp55mylgiuffCJbsMh0c2upu" export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEOH//////////wEaCXVzLWVhc3QtMSJHMEUCIQCsuuLiCr/hAzMMDBeI7veb5mRRaTDph8MpmXUacs6pFPbSgIgMCwgSxdwzPZTSJkmEnm4Oaavozz3xrBqVLwiRzQRh6QqqgMImf//////////ARAAGgwxNTMwNTkwMjgwNTAiDM7dlNKEORNon4QnTSr+AleIWt0EBxM5lWHraEDvaGdlG4ocAE4cADKDfX6blILhUC5FWaWfMaYaAvKgT23hJ8wUPyHjlortb8oOeEwl0bW4XD6S6kis9Gi1g5D6DDJlrjgKfoLrLkHL5XJ7QabkbmNf6xs5mUuwW6nI6vSR6aXlih3zjgLp30Aivo+ubrj2lo4Lm+nQPfR5mop7JTHQpTzbh/zqgLpFgdso+86jI1KcRRHJxEKfbArPzv38yfFkZtGyFGfX+hETnZ1c9GQCilKzhq7Bz60oopC0JrsKZ6U9cMfTGwF7kNd31G9/T7mupsq540VYT6fj43w0VKCcf8bJbBGbYed5OsKf5vfLV+nCOf2sFwlaa8mwnqcS95uiG59gF9y9Mma4bT6wLwqjBrjB3Xo1lYu/IuQiFPfT9XAZ0L42z/AEcBIa6EEtOjGkeSLtT8u6hoYMqPrg1pzM52Ckd/6OlAvkJuISBLAreweSysgPyhVGG7TKTvQL4ULGxUt8BNJIIWO88NN/OfcwzdTomQY6pgEvA14o3xY4nAzpRqWeanbaiiQmw/lXTvZIatggoEM7oe1TX/sD2iB2gir+5HQxO4ZMC5c0xy8XlkcWYidEjuLrlLZ6Bz9m3jWf0uNavwts20IRUf71maLlAFJ8ozWKqtt71c+62/K8cL/f3u/FXE9NdXnr7q+oCxtWUiemw0EOtmUWGwCLOKBrNVJk+zyFVxtA/3stl4dSCj1Ve9L+t5upZvfoBbIH" aws ssm start-session \ --target i-0fac71837dd267123 \ --document-name AWS-StartInteractiveCommand \ --parameters 'command="sudo apt-get update && sudo apt install curl -y && sudo apt install -y default-jdk"'
这个方式会在远程实例上执行完指定命令后自动退出会话,脚本可继续执行后续逻辑。
注意事项
- 确保目标AWS实例已安装并运行SSM Agent,否则无法接收SSM命令。
- 本地AWS CLI需要具备
ssm:SendCommand或ssm:StartSession的操作权限。
内容的提问来源于stack exchange,提问作者Harris
相关产品推荐
相关产品推荐

