我有一个由 AWS 创建的 websocket url。URL 由 aws ssm start session 使用 .net sdk 创建。开始会话方法给了我 streamUrl、令牌和会话 ID。URL 格式如下:
wss://ssmmessages.ap-south-1.amazonaws.com/v1/data-channel/sessionidhere?role=publish_subscribe
在“sessionidhere”位置有我无法共享的实际会话 ID。
我想使用xterm.js在网络上打开终端。我读过 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));
第三,我没有得到任何错误,但也没有得到输出......有人可以帮忙吗?