отправить вывод exe c in node.js почтальону после его окончания - PullRequest
1 голос
/ 12 апреля 2020

в почтальоне Я отправляю запрос на мой express сервер, который должен выполнить системную команду и сохранить выходные данные в переменной, и только после завершения дочернего процесса я хочу получить ответ, содержащий выходные данные функции exe c в почтальоне.

app.post('/exploit', function(request, response) {            
  var script = request.body.script;
  var command = " msfconsole -q -r ~/Desktop/automation/meterpreter.rc ;                    
  python "+script;
   var child = exec(command);
        child.stdout.setEncoding('utf8');
        child.stdout.on('data', function(data) {

            console.log('stdout: ' + data);
            data=data.toString();
            scriptOutput+=data;

    });
    function finaloutput() {
        response.end(scriptOutput);
      }
    setTimeout(finaloutput, 180000);
     });

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

1 Ответ

0 голосов
/ 12 апреля 2020

Во-первых, ваш обработчик запросов опасен. Вы позволяете вводить неантифицированный пользовательский ввод непосредственно в командную строку.

Во-вторых, вы используете exec() так, как если бы вы использовали spawn(), а не как exec(). Exe c буферизирует весь вывод, ждет, пока программа не будет завершена, и затем выдает вам весь вывод сразу, как это:

app.post('/exploit', function(request, response) {
    // note this is dangerous to put unsanitized user input directly onto the command line
    var script = request.body.script;
    var command = " msfconsole -q -r ~/Desktop/automation/meterpreter.rc ; python " + script;
    exec(command, function(error, stdout, stderr) {
        if (error) {
            console.log(error);
            response.sendStatus(500);
        } else {
            response.send(stdout);
        }
    });
});
...