Invoke-WebRequest
命令:instanceId=i-0xyz # Change this.
cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --parameters commands='"While ($i -le 10) {Invoke-WebRequest -UseBasicParsing -Uri http://example.com; $i += 1}"')
sleep 1
aws ssm list-command-invocations --command-id "$cmdId" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text
但是,输出被截断了: br />
如何运行
aws ssm list-command-invocations
命令,所以输出不会被截断?#1 楼
根据此ssm教程,SSM发送命令输出被截断为2500个字符。要解决此问题,必须使用--output-s3-bucket-name
参数将输出发送到S3存储桶。#2 楼
这是一个帮助程序Bash脚本,它使用带有aws ssm send-command
参数的--output-s3-bucket-name
来运行命令,并将结果存储在S3存储桶中,然后显示到标准输出。示例:
#/usr/bin/env bash -xe
# Script to run PowerShell script on the Windows instance, then uploads the output to S3 bucket.
instanceId=""
bucketName=""
bucketDir="Output"
[ $# -le 2 ] && { echo "Usage: ./run_ec2_ps_cmd_s3.sh i-0xyz my-bucket-name 'While ($i -le 10) {(Invoke-WebRequest -UseBasicParsing -Uri http://example.com).Content; $i++}'
instance_id bucket_name command"; exit 1; }
aws s3 ls ${bucketName} > /dev/null
cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --output-s3-bucket-name "$bucketName" --output-s3-key-prefix "$bucketDir" --parameters commands="'${@:3}'")
while [ "$(aws ssm list-command-invocations --command-id "$cmdId" --query "CommandInvocations[].Status" --output text)" == "InProgress" ]; do sleep 1; done
outputPath=$(aws ssm list-command-invocations --command-id "$cmdId" --details --query "CommandInvocations[].CommandPlugins[].OutputS3KeyPrefix" --output text)
aws s3 ls s3://${bucketName}/${outputPath}/stderr.txt && aws s3 cp --quiet s3://${bucketName}/${outputPath}/stderr.txt /dev/stderr
aws s3 cp --quiet s3://${bucketName}/${outputPath}/stdout.txt /dev/stdout
评论
几句话:1.为什么要先使用s3 ls?这听起来像什么都没有的api查询。 2.测试InProgress非常脆弱,ssm命令可能处于Pending状态,并且脚本将失败。 3. S3上文件的可用性可能会延迟几秒钟,执行重试循环通常有助于将内容取回
–滕西拜
18年2月21日在15:06
@Tensibai 1.确保存储桶存在,否则执行该命令毫无意义。 2.到目前为止,我只注意到InProgress,它会检查我是否还有Pendingas。3.如果SSM命令已完成,我认为我们可以假定文件已经存在。到目前为止还没有问题,尽管仍在对该脚本进行大量测试。
– Kenorb
18年2月21日在15:09
这就是我在Linux实例的运行shell脚本中观察到的内容:)
–滕西拜
18年2月21日在15:12
根据此list-command-invocations链接,Status的可能值为InProgress,Success,TimedOut,Canceled,Failed,所以据我所知,没有待决的值。
– Kenorb
18年2月21日在15:15
w,的确,我使用列表命令是因为我以倍数实例为目标,该命令的状态也为“待处理”。
–滕西拜
18年2月21日在15:23