如何使用AWS Java SDK 1.11.x通过SSM在Windows EC2实例执行quser命令?
使用AWS Java SDK 1.11.x通过SSM在Windows EC2实例上执行quser命令
我之前刚好做过类似的操作,用AWS Java SDK 1.11.x实现这个需求和你找到的AWS CLI逻辑是对应的,核心就是构造SendCommandRequest对象,指定目标实例、要执行的SSM文档以及PowerShell命令参数。下面是完整的实现步骤和代码示例:
1. 确保引入正确的SDK依赖
首先,在你的项目中添加AWS SSM SDK的依赖,如果用Maven的话,pom.xml里加上:
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-ssm</artifactId> <version>1.11.1000</version> <!-- 可以替换为你需要的1.11.x版本 --> </dependency>
2. 完整代码实现
下面的代码会初始化SSM客户端,发送执行quser命令的请求,并返回命令ID(你可以用这个ID后续查询命令的执行结果):
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.regions.Regions; import com.amazonaws.services.simplesystemsmanagement.AmazonSSM; import com.amazonaws.services.simplesystemsmanagement.AmazonSSMClientBuilder; import com.amazonaws.services.simplesystemsmanagement.model.SendCommandRequest; import com.amazonaws.services.simplesystemsmanagement.model.SendCommandResult; import java.util.Collections; public class SsmQuserExecutor { public static void main(String[] args) { // 1. 初始化SSM客户端,这里使用默认凭证链(环境变量、IAM角色等)和指定区域 AmazonSSM ssmClient = AmazonSSMClientBuilder.standard() .withCredentials(DefaultAWSCredentialsProviderChain.getInstance()) .withRegion(Regions.US_EAST_1) // 替换为你的实例所在区域 .build(); // 2. 构造SendCommandRequest SendCommandRequest sendCommandRequest = new SendCommandRequest() // 指定目标EC2实例ID,可以添加多个ID实现批量执行 .withInstanceIds("your-instance-id-1", "your-instance-id-2") // 指定要使用的SSM文档,对应CLI的--document-name .withDocumentName("AWS-RunPowerShellScript") .withComment("Get logged-in users via quser command") // 设置命令参数,对应CLI的--parameters commands=quser .withParameters(Collections.singletonMap("commands", Collections.singletonList("quser"))); // 3. 发送命令并处理响应 try { SendCommandResult result = ssmClient.sendCommand(sendCommandRequest); String commandId = result.getCommand().getCommandId(); System.out.println("Command sent successfully. Command ID: " + commandId); // 如果你需要获取命令的执行输出,可以后续用GetCommandInvocationRequest查询 } catch (Exception e) { System.err.println("Failed to send command: " + e.getMessage()); e.printStackTrace(); } finally { ssmClient.shutdown(); } } }
关键细节说明
- 凭证和区域:代码中使用
DefaultAWSCredentialsProviderChain会自动从环境变量、系统属性、IAM角色(如果是在EC2实例或EKS中运行)等位置获取凭证,你也可以根据需求指定自定义的凭证提供者。区域要替换为你的EC2实例所在的AWS区域。 - 批量执行:如果要在多个实例上执行,只需要在
withInstanceIds中添加多个实例ID即可,不需要逐个调用接口。 - 查询执行结果:如果需要获取
quser命令的输出内容,可以使用GetCommandInvocationRequest,传入之前得到的commandId和实例ID,调用ssmClient.getCommandInvocation()获取结果。
内容的提问来源于stack exchange,提问作者Alexandre Krabbe
相关产品推荐
相关产品推荐

