1

Тема: 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

Тестировал локально, думаю с удаленным выполнением проблем быть не должно, если открыть соответствующий порт.
Если кто найдет время и возможность попробовать, пожалуйста, оставьте ваши замечания, предложения.

2

Re: WebSocket как инструмент удаленного администрирования

Создал репозиторий на GitHub, сделал pull request, автор websocketd заценил и добавил ссылку на созданный проект в раздел Example Project. Happy End .