Тема: WebSocket как инструмент удаленного администрирования
Здравствуйте, уважаемые коллеги.
Хочу поделиться с вами одной интересной находкой - websocketd, а также своей реализацией инструмента удаленного выполнения кода, основанной на websocketd.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>WS-console</title>
</head>
<body>
IP: <input id="ip" type="text" value="127.0.0.1">
Port: <input id="port" type="text" value="8081"><br/>
<textarea id="txt" cols="60" rows="10"></textarea><br/>
<input id="btn" type="button" value="R U N"/>
<input id="vbs" type="radio" name="code" checked> VBScript
<input id="js" type="radio" name="code"> JScript
<pre id="log"></pre>
<script>
document.getElementById('txt').focus();
btn.addEventListener('click', function(e) {
var ip = document.getElementById('ip').value,
port = document.getElementById('port').value,
ws = new WebSocket('ws://' + ip + ':' + port);
ws.onopen = function() {
log('CONNECTED');
var d = document.all ? '\r\n' : '\n';
var arr = txt.value.split(d);
var js = document.getElementById('js'), msg;
if (js.checked) {
for (var i=0; i<arr.length; i++) {
arr[i] = arr[i].replace(/(\/\*([\s\S]*?)\*\/)|(\/\/(.*)$)/g, '');
}
msg = arr.join(' ');
} else {
var und = false;
for (var i=0; i<arr.length; i++) {
if (arr[i].search(/ _$/) != -1) {
arr[i] = arr[i].replace(/ _$/, '');
arr[i] += arr[i+1];
arr.splice(i+1, 1);
i--;
continue;
}
arr[i] = arr[i].replace(/^\s+|^\s*(?:'|\brem\b).*$|(?:'|\brem\b)[^(?:\"|_$)].*$|\s+$/gi, '');
}
msg = arr.join(' : ');
}
ws.send(msg);
};
ws.onmessage = function(e) {
log('MESSAGE: ' + e.data);
};
ws.onclose = function(e) {
log('DISCONNECTED');
log('Clean = ' + e.wasClean + ', Code = ' + e.code + ', Reason = ' + (e.reason || 'none'));
};
});
function log(msg) {
document.getElementById('log').innerText += msg + '\n';
}
</script>
</body>
</html>
Серверная часть.
На VBScript:
- console.vbs:
Call Execute(WScript.StdIn.ReadLine())
- console.cmd:
@echo off
cscript /nologo console.vbs
На JScript:
- console.js:
eval(WScript.StdIn.ReadLine());
- console.cmd:
@echo off
cscript /nologo console.js
Разумеется рядом со скриптом и командным файлом должен находиться websocketd.exe.
Кроме того демон должен быть запущен:
websocketd --port 8081 console.cmd
Тестировал локально, думаю с удаленным выполнением проблем быть не должно, если открыть соответствующий порт.
Если кто найдет время и возможность попробовать, пожалуйста, оставьте ваши замечания, предложения.