解决REST API调用Azure容器实例执行命令的WebSocket问题
解决Azure容器实例(ACI)WebSocket执行命令的协议与回显问题
ACI WebSocket执行命令的核心协议细节
ACI的WebSocket执行命令服务采用自定义二进制帧协议,官方文档未明确说明具体格式,但实际交互必须遵循以下规则:
- 发送的每一条消息(密码、命令)都需要封装为「4字节大端序长度前缀 + UTF-8编码的内容」的二进制包
- 服务端返回的响应同样遵循该格式,必须先解析长度前缀,再读取对应长度的内容才能得到可读文本
解决密码验证与命令回显问题
你遇到的十六进制>和二进制回显,本质是未正确解析服务端的二进制响应帧:
- 发送密码时,必须按上述二进制格式封装后发送,不能直接传文本
- 收到服务端响应时,先读取前4字节解析出内容长度,再截取后续对应长度的字节转成UTF-8字符串,就能得到正常的
>提示符或命令输出
执行rcon-cli的正确流程
- 建立WebSocket连接到获取的WSS URL
- 按二进制协议格式发送密码,等待解析出的响应中出现
>提示符,说明验证成功 - 同样用二进制帧格式发送
rcon-cli命令,解析返回内容即可进入目标shell交互
代码实现示例(Node.js)
const WebSocket = require('ws'); const { Buffer } = require('buffer'); // 封装消息为ACI要求的二进制格式 function wrapMessage(content) { const contentBuffer = Buffer.from(content, 'utf8'); const lengthBuffer = Buffer.alloc(4); lengthBuffer.writeUInt32BE(contentBuffer.length, 0); return Buffer.concat([lengthBuffer, contentBuffer]); } // 初始化WebSocket连接 const ws = new WebSocket('你的WSS URL'); ws.on('open', () => { // 发送验证密码 ws.send(wrapMessage('你的密码')); }); ws.on('message', (data) => { // 解析服务端响应 const contentLength = data.readUInt32BE(0); const content = data.slice(4, 4 + contentLength).toString('utf8'); console.log('输出:', content); // 验证成功后发送rcon-cli命令 if (content.includes('>')) { ws.send(wrapMessage('rcon-cli')); } });
Postman调试说明
Postman的WebSocket工具对自定义二进制协议支持有限,容易出现无响应或格式错误,建议用代码实现协议解析,避免工具限制。
内容的提问来源于stack exchange,提问作者blockarchitech
相关产品推荐
相关产品推荐

