Почему команда оболочки запускается несколько раз за запрос POST вместо одного. Я использую nodejs и модуль простого ssh-узла - PullRequest
2 голосов
/ 05 июля 2019

Как вызывать сценарий оболочки только один раз за POST-запрос с экспресс-сервера, используя модуль узла simple-ssh. Примечание: в моем первом запросе POST скрипт / команда выполняется один раз, но при последующем запросе команда выполняется несколько раз. В чем причина такого поведения?

// Snippet that executed once I sent a POST request
  router.post('/testScript', function (req, res, next) {
    res.json({
        'some json': 'To be send'
    })
    next()
  }, function (req, res) {
    ssh.exec('echo $PATH', {
        out: function(stdout) {
            console.log(stdout);
        }
    }).start();
  })

Результат в моей консоли:

POST /unixscripts/testScript 200 69.202 ms - 34
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

См. Запрос POST запускается один раз, но сценарий выполняется несколько раз. Зачем? Ожидаемый результат каждый раз, когда я отправляю запрос POST:

POST /unixscripts/testScript 200 69.202 ms - 34
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

1 Ответ

0 голосов
/ 05 июля 2019

Кажется, есть проблема с модулем simple-ssh, когда обратный вызов запускается несколько раз при использовании в цикле.Это подтверждается в выпуске github здесь .Также кажется, что модуль в данный момент не находится в активной разработке.

Хотя я не уверен, почему это происходит, но в случае simple-ssh функция exec добавляет команду в стек.Поскольку вы используете общий объект соединения ssh, при следующем вызове старая команда все еще существует в стеке.Затем функция start выполняет весь стек.

Модуль внутренне использует более старую версию модуля ssh2.Вы можете использовать этот модуль непосредственно в вашем случае.

npm install ssh2

var Client = require('ssh2').Client;

router.post('/script', function (req, res, next) {
    res.json({
        'some json': 'To be send'
    })
    next()
}, function (req, res) {
    var conn = new Client();
    conn.on('ready', function () {
        conn.exec('echo $PATH', function (err, stream) {
            if (err) throw err;
            stream.on('data', function (data) {
                console.log('STDOUT: ' + data);
            }).on('close', function (code, signal) {
                conn.end();
            })
        });
    }).connect({
        host: 'localhost',
        username: 'user',
        password: 'password'
    });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...