gpt4 book ai didi

javascript - 如何使用 xterm.js 向 AWS session 管理器 websocket url 发送命令?

转载 作者:行者123 更新时间:2023-12-05 00:34:40 25 4
gpt4 key购买 nike

我有一个由 AWS 创建的 websocket url。 URL 由 aws ssm start session 使用 .net sdk 创建。
开始 session 方法给了我 streamUrl、 token 和 session ID。
URL 采用以下格式:

wss://ssmmessages.ap-south-1.amazonaws.com/v1/data-channel/sessionidhere?role=publish_subscribe
在“sessionidhere”位置有我无法共享的实际 session 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>
现在, session 正在打开,我收到建立连接的警报。它正在成功连接,但是每当我尝试发送命令时,连接都会通过说“打开数据 channel 的请求不包含 token ”来关闭。我尝试以 3 种方式发送命令。
首先是:
ws.send("ls")
第二:
let data = {
method: "command", command: curr_line
}
ws.send(JSON.stringify(data));
但面临同样的错误,即打开数据 channel 的请求不包含 token ,连接死亡
第三:
var enc = new TextEncoder("utf-8"); 
var data = "ls";
ws.send(enc.encode(data));
第三,我没有得到任何错误,但也没有得到输出......有人可以帮忙吗?

最佳答案

AWS session 管理器使用的协议(protocol)包括以下内容:

  • 在流 URL
  • 上打开 websocket 连接
  • 发送由以下 JSON 字符串组成的身份验证请求:

  • {
    "MessageSchemaVersion": "1.0",
    "RequestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "TokenValue": "<YOUR-TOKEN-VALUE>"
    }
    从这一刻起,协议(protocol)不再是 JSON。在官方 Amazon SSM agent中实现如果您想从 AWS CLI 启动 SSM session ,这是必需的。有效载荷必须根据 this binary format 发送和接收
    几个月前我的要求和你完全一样,所以我制作了一个 AWS Session manager 客户端库: https://github.com/bertrandmartel/aws-ssm-session对于 nodejs 和浏览器。如果您想了解有关协议(protocol)如何工作的更多信息,请查看 this
    可用于浏览器的示例代码使用 xterm.js
    首先克隆项目并使用 aws-api 和一些实用程序脚本生成 websocket URL 和 token :
    git clone git@github.com: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'
    }
    然后提供示例应用程序:
    npm install http-server -g
    http-server -a localhost -p 3000
    转到 http://localhost:3000/test/web,输入 websocket URI 和 token :
    enter image description here
    sample code for browser :
    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);
    });
    }

    关于javascript - 如何使用 xterm.js 向 AWS session 管理器 websocket url 发送命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64195313/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com