如何使用XTERM.JS将命令发送到AWS Session Manager Websocket URL?

问题描述 投票:0回答:1
我有一个由AWS创建的Websocket URL。 URL由AWS SSM使用.NET SDK创建。 启动会话方法使我可以流动,令牌和会话ID。 URL采用以下格式:

wss://ssmmessages.ap-south-1.amazonaws.com/v1/data-channel/sessionidhere?role=publish_subscribe
我无法共享的“ SessionIdhere”的实际会话ID。

我想使用

xterm.js

在Web上打开终端。我读过Xterm.js可以连接到WebSocket URL,发送消息并接收输出。 我的JavaScript代码在这里: <!doctype html> <html> <head> <link href="~/xterm.css" rel="stylesheet" /> <script src="~/Scripts/jquery-3.4.1.js"></script> <script src="~/Scripts/bootstrap.js"></script> <script src="~/xterm.js"></script> </head> <body> <div id="terminal"></div> <script type="text/javascript"> var term = new Terminal({ cursorBlink: "block" }); var curr_line = ""; var entries = []; term.open(document.getElementById('terminal')); const ws = new WebSocket("wss://ssmmessages.ap-south-1.amazonaws.com/v1/data-channel/sessionid?role=publish_subscribe?token=tokenvalue"); var curr_line = ""; var entries = []; term.write("web shell $ "); term.prompt = () => { if (curr_line) { let data = { method: "command", command: curr_line } ws.send(JSON.stringify(data)); } }; term.prompt(); ws.onopen = function (e) { alert("[open] Connection established"); alert("Sending to server"); var enc = new TextEncoder("utf-8"); // always utf-8 // console.log(enc.encode("This is a string converted to a Uint8Array")); var data = "ls"; console.log(enc.encode(data)); alert(enc.encode(data)); ws.send(enc.encode(data)); alert(JSON.stringify(e)); }; ws.onclose = function (event) { if (event.wasClean) { alert(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`); } else { // e.g. server process killed or network down // event.code is usually 1006 in this case alert('[close] Connection died'); } }; ws.onerror = function (error) { alert(`[error] ${error.message}`); }; // Receive data from socket ws.onmessage = msg => { alert(data); term.write("\r\n" + JSON.parse(msg.data).data); curr_line = ""; }; term.on("key", function (key, ev) { //Enter if (ev.keyCode === 13) { if (curr_line) { entries.push(curr_line); term.write("\r\n"); term.prompt(); } } else if (ev.keyCode === 8) { // Backspace if (curr_line) { curr_line = curr_line.slice(0, curr_line.length - 1); term.write("\b \b"); } } else { curr_line += key; term.write(key); } }); // paste value term.on("paste", function (data) { curr_line += data; term.write(data); }); </script> </body> </html>

现在,会议正在打开,我正在对建立的连接保持警惕。这是成功的连接,但是每当我尝试发送命令时,就会说“打开数据频道的请求不包含令牌”,即将关闭连接。我尝试以3种方式发送命令。 首先是:

ws.send("ls")

秒:

let data = { method: "command", command: curr_line } ws.send(JSON.stringify(data));

但是面临相同的错误,即打开数据通道的请求不包含令牌,连接已死
第三:

var enc = new TextEncoder("utf-8"); var data = "ls"; ws.send(enc.encode(data));
对于第三,我没有任何错误,但也没有输出...有人可以帮忙吗?
    

AWS Session Manager使用的协议包括以下内容:

在流URL
上开设Websocket连接

提供由以下JSON组成的身份验证请求:

javascript amazon-web-services websocket aws-ssm xtermjs
1个回答
16
投票
{ "MessageSchemaVersion": "1.0", "RequestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "TokenValue": "<YOUR-TOKEN-VALUE>" }

从这一刻,协议不再是JSON。它是在官方
    MazonSSMAgent
  • 中实现的,如果您想从AWS CLI启动SSM会话,则需要。有效载荷必须按照此二进制格式发送和接收 我的要求与几个月前完全相同,因此我制作了一个AWS会话管理器库:
  • https://github.com/bertrandmartel/aws-ssm-sesmessessin for nodejs and Browser。如果您想要有关协议的工作方式的更多信息,请查看this
可用于浏览器的示例代码使用xterm.js
首先使用AWS-API使用一些实用程序脚本来生成Websocket URL和令牌:

git clone [email protected]:bertrandmartel/aws-ssm-session.git cd aws-ssm-session npm i npm run build node scripts/generate-session.js 给你:

{ SessionId: 'xxxxxx-xxxxxxxxxxxxxx', TokenValue: 'YOUR_TOKEN', StreamUrl: 'wss://ssmmessages.eu-west-3.amazonaws.com/v1/data-channel/user-xxxxxxxxxxxxxx?role=publish_subscribe' }

then提供示例应用程序: npm install http-server -g http-server -a localhost -p 3000 togo到http:// localhost:3000/test/web,输入Websocket URI和令牌:

浏览器的sample代码:

import { ssm } from "ssm-session"; var socket; var terminal; const termOptions = { rows: 34, cols: 197 }; function startSession(){ var tokenValue = document.getElementById("tokenValue").value; var websocketStreamURL = document.getElementById("websocketStreamURL").value; socket = new WebSocket(websocketStreamURL); socket.binaryType = "arraybuffer"; initTerminal() socket.addEventListener('open', function (event) { ssm.init(socket, { token: tokenValue, termOptions: termOptions }); }); socket.addEventListener('close', function (event) { console.log("Websocket closed") }); socket.addEventListener('message', function (event) { var agentMessage = ssm.decode(event.data); //console.log(agentMessage); ssm.sendACK(socket, agentMessage); if (agentMessage.payloadType === 1){ terminal.write(agentMessage.payload) } else if (agentMessage.payloadType === 17){ ssm.sendInitMessage(socket, termOptions); } }); } function stopSession(){ if (socket){ socket.close(); } terminal.dispose() } function initTerminal() { terminal = new window.Terminal(termOptions); terminal.open(document.getElementById('terminal')); terminal.onKey(e => { ssm.sendText(socket, e.key); }); terminal.on('paste', function(data) { ssm.sendText(socket, data); }); }


我试图在

https://github.com/bertrandmartel/aws-ssm-session

和ran中运行此代码:
NPM安装http -server -g
http -server -a localhost -p 3000
但是,我无法访问http:// localhost:3000/test/web.

有人可以支持我吗?

enter image description here

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.