本教程详细介绍如何使用 Alibaba Cloud SDK for Java 创建并执行云助手命令。

前提条件

在使用本教程之前,请确保已完成以下操作:
  • 使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面上创建和查看您的AccessKey。
  • 确保您已经安装了Alibaba Cloud SDK for Java,准确的SDK版本号,请参见 阿里云开发工具包(SDK)
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.4.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-ecs-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-ecs</artifactId>
            <version>4.17.4</version>
        </dependency>
    </dependencies>

代码示例

本文操作示例主要以代码形式体现,具体代码如下:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.CreateCommandRequest;
import com.aliyuncs.ecs.model.v20140526.CreateCommandResponse;
import com.aliyuncs.ecs.model.v20140526.InvokeCommandRequest;
import com.aliyuncs.ecs.model.v20140526.InvokeCommandResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

/**
 * CreateCommand    新建一条云助手命令
 * InvokeCommand    为一台或多台ECS实例触发一条云助手命令
 */
public class InvokeCommand {

    private static String command = "cd /usr/local&&pwd";
    // 实例ID集合 需要您按照实际情况来进行定义或传入
    // private static List<String> instanceIds = new ArrayList<String>();

    public static void main(String[] args) throws UnsupportedEncodingException {
        IAcsClient client = Initialization();
        // 对需要新建的云助手命令进行base64编码
        String CommandContent = Base64CommandContent(command);
        // 新建一条云助手命令
        String commandId = CreateCommand(client, CommandContent);
        // 为一台或多台ECS实例触发一条云助手命令
        TestInvokeCommand(client, commandId);
    }

    /**
     * InvokeCommand    为一台或多台ECS实例触发一条云助手命令
     */
    private static void TestInvokeCommand(IAcsClient client, String commandId) {
        InvokeCommandRequest request = new InvokeCommandRequest();
        request.setCommandId(commandId);
        // 实例ID集合
        List<String> instanceIds = new ArrayList<>();
        instanceIds.add("i-bp1cu83ktXXXXXXX");
        request.setInstanceIds(instanceIds);
        request.setTimed(false);
        try {
            InvokeCommandResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }

    /**
     * CreateCommand    新建一条云助手命令
     */
    private static String CreateCommand(IAcsClient client, String CommandContent) {
        CreateCommandRequest request = new CreateCommandRequest();
        // 命令名称,支持全字符集。长度不得超过128个字符
        request.setName("test");
        // 创建的命令是否使用自定义参数。默认值:false
        request.setEnableParameter(true);
        // 命令的类型。取值范围:
        // RunBatScript:创建一个在Windows实例中运行的 Bat 脚本
        // RunPowerShellScript:创建一个在Windows实例中运行的PowerShell脚本
        // RunShellScript:创建一个在Linux实例中运行的Shell脚本
        request.setType("RunShellScript");
        // 命令描述,支持全字符集。长度不得超过512个字符
        request.setDescription("Test1");
        // 您创建的命令在ECS实例中执行时最大的超时时间,单位为秒。当因为某种原因无法运行您创建的命令时,会出现超时现象。超时后,会强制终止命令进程,即取消命令的PID。
        // 默认值:3600
        request.setTimeout(3600L);
        // 您创建的命令在ECS实例中运行的目录。默认值:
        // 对于Linux实例,默认在管理员root用户的home目录下,具体为/root目录
        // 对于Windows实例,默认在云助手客户端进程所在目录,例如,C:\ProgramData\aliyun\assist\$(version)
        request.setWorkingDir("/home/");
        // 命令Base64编码后的内容。
        // 该参数的值必须使用Base64编码后传输,且脚本内容的大小在Base64编码之后不能超过16KB
        // 命令内容支持使用自定义参数形式,具体通过指定参数EnableParameter=true启用自定义参数功能:
        //      自定义参数用{{}}包含的方式定义,在{{}}内参数名前后的空格以及换行符会被忽略
        //      自定义参数个数不能超过20个
        //      自定义参数名允许a-zA-Z0-9-_的组合,不支持其余字符,参数名不区分大小写
        //      单个参数名不能超过64字节
        request.setCommandContent(CommandContent);
        try {
            CreateCommandResponse response = client.getAcsResponse(request);
            System.out.println("--------------------新建云助手命令--------------------");
            System.out.println(new Gson().toJson(response));
            return response.getCommandId();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
            throw new RuntimeException();
        }
    }

    /**
     * Initialization  初始化公共请求参数
     */
    private static IAcsClient Initialization() {
        // 初始化请求参数
        DefaultProfile profile = DefaultProfile.getProfile(
                "<your-region-id>", // 您的可用区ID
                "<your-access-key-id>", // 您的AccessKey ID
                "<your-access-key-secret>"); // 您的AccessKey Secret
        return new DefaultAcsClient(profile);
    }

    /**
     * base64 编码
     */
    private static String Base64CommandContent(String command) throws UnsupportedEncodingException {
        byte[] strByte = command.getBytes("UTF-8");
        // 编码
        return Base64.getEncoder().encodeToString(strByte);
        // 解码
        // return new String(Base64.getDecoder().decode(strByte), "UTF-8");
    }
}

执行结果

正确的返回结果类似如下:
--------------------新建云助手命令--------------------
{
    "requestId": "027AA594-D878-41A2-A94B-CB26634490D9", 
    "commandId": "c-dd5e470aa3e44XXXXXXXX"
}
--------------------触发云助手命令--------------------
{
    "requestId": "CDCC2045-F951-4A7F-923C-E045044CC443", 
    "invokeId": "t-27f4fdbdeb7XXXXXXXX"
}