Copyright (C) 2016-2020 Anton Skshidlevsky (meefik), MIT
The cross platform WebSocket implementation for UNIX shell. It works on busybox and ash for embedded systems (requires installing busybox applets).
Run web server httpd in websocket.sh directory. For JQuery Terminal Emulator:
cd jquery.terminal
WS_SHELL="sh" httpd -p 8080
For xterm.js:
cd xterm.js
telnetd -p 5023 -l "/bin/sh" -f ./issue
WS_SHELL="telnet 127.0.0.1 5023" httpd -p 8080
Open the terminal in browser: http://localhost:8080/
Run websocket.sh:
WS_SHELL="cat" nc -l -p 12010 -e websocket.sh
Use from browser:
var wsPort = 12010;
var ws = new WebSocket('ws://' + location.hostname + ':' + wsPort);
ws.onmessage = function(ev) {
var textDecoder = new TextDecoder();
var fileReader = new FileReader();
fileReader.addEventListener('load', function () {
var str = textDecoder.decode(fileReader.result);
console.log('Received data: ', str);
});
fileReader.readAsArrayBuffer(ev.data);
}
ws.onopen = function() {
ws.send('hello');
}
When user closes tab ws disconnect then nc
will also exit.
You can use -ll
with -e
for persistent server:
nc -ll -p 12010 -e websocket.sh
You can use busybox inetd for multiple connections to single port for websocket.sh:
export WS_SHELL="/path/to/script.sh"
inetd -e -f /path/to/inetd.conf
The /path/to/inetd.conf
may look like:
12010 stream tcp nowait root /path/to/websocket.sh
Ubuntu already have busybox with httpd
with cgi and nc
with -e
.
So to run the scripts you need to change shebang and add busybox to commands.
You can apply the patch:
diff --git a/cgi-bin/init-ws.sh b/cgi-bin/init-ws.sh
index 78fec21..086ecd2 100755
--- a/cgi-bin/init-ws.sh
+++ b/cgi-bin/init-ws.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/busybox sh
let PORT=${HTTP_HOST##*:}
if [ $PORT -eq 0 ]
@@ -6,7 +6,7 @@ then
else
WS_PORT=$(( PORT+1 ))
fi
-nc -l -p ${WS_PORT} -e ../websocket.sh </dev/null >/dev/null &
+busybox nc -l -p ${WS_PORT} -e ../websocket.sh </dev/null >/dev/null &
echo "Content-Type: application/javascript"
diff --git a/cgi-bin/resize b/cgi-bin/resize
index 903768d..ab82f33 100755
--- a/cgi-bin/resize
+++ b/cgi-bin/resize
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/busybox sh
for param in ${QUERY_STRING//&/ }
diff --git a/websocket.sh b/websocket.sh
index affb009..6d86889 100755
--- a/websocket.sh
+++ b/websocket.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/busybox sh
# websocket.sh
# (C) 2016-2018 Anton Skshidlevsky <[email protected]>, MIT
Then to run xterm.js:
busybox telnetd -p 5023 -l "/bin/sh" -f ./issue
WS_SHELL="telnet 127.0.0.1 5023" busybox httpd -p 8080 -f -vv
Here httpd started with debug mode so you can see any errors in cgi scripts.
In Ubuntu the nc
command from netcat-openbsd
doesn't have the -e
option.
You'll need to install ncat
package (sudo apt install ncat
) and replace nc
inside init-ws.sh
with ncat
.
The /bin/sh
in Ubuntu is Dash and it doesn't have read -n
option.
So you'll need to change shebang to #!/bin/bash