SSH с nodejs

1

Попытка создания файлов и т.д. На новых vps, которые были созданы с помощью api. По какой-то причине эта функция не запускает вторую команду ssh. Перед запуском этой функции выполняется еще одна, которая также запускает несколько команд для установки пакетов перед установкой файлов. У меня есть функция, запущенная после истечения таймера, чтобы он мог использовать некоторые из пакетов для запуска таких команд, как экран. Он запускает первый ssh, но не второй, и я пробовал с таймером до 180 секунд.

function CreateServer( SIP, GUSER, SPORT ) {
var CDir = "";
var RPassword = generator.generate({
    length: 10,
    numbers: true
});
var ssh = new SSH({
    host: SIP,
    user: 'root',
    key: fs.readFileSync('serverkey.ppk')
    //pass: 'password'
});

ssh.exec('if test -d /home/' + GUSER + '; then echo "exist"; fi', {
    out: function(stdout) {
        CDir = stdout;
        //console.log(stdout);
    }
}).start();
setTimeout(function(){
    if(CDir == DMkdir) {
        console.log("User on machine not adding......");
        ssh.exec('chown -R ' + GUSER + ':' + GUSER + ' /home/' + GUSER + '; su - ' + GUSER + ' -c "cd /home/' + GUSER + '/steamcmd ; screen -mdSL ' + SIP + ':' + SPORT + ' ./steamcmd.sh +login anonymous +force_install_dir /home/' + GUSER + '/' + SIP + '.' + SPORT + ' +app_update 4020 validate +quit"', {
            out: function(stdout) {
                //console.log(stdout);
            }
        }).start();             
    } else {
        console.log("User not on machine adding......");
        ssh.exec('cd /home/; sudo adduser ' + GUSER + ' --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password; echo "' + GUSER + ':' + RPassword + '" | sudo chpasswd; cd /home/' + GUSER + '/; mkdir steamcmd; cd /home/' + GUSER + '/steamcmd; wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz; tar -xvzf steamcmd_linux.tar.gz; chown -R ' + GUSER + ':' + GUSER + ' /home/' + GUSER + '; su - ' + GUSER + ' -c "cd /home/' + GUSER + '/steamcmd ; screen -mdSL ' + SIP + ':' + SPORT + ' ./steamcmd.sh +login anonymous +force_install_dir /home/' + GUSER + '/' + SIP + '.' + SPORT + ' +app_update 4020 validate +quit"', {
            out: function(stdout) {
                console.log(stdout);
            }
        }).start();
    }
}, 5 * 1000);
return true;

}

Теги:
ssh

1 ответ

0
Лучший ответ

Я предполагаю, что все правильно, кроме вашей проблемы с обработкой двух асинхронных событий. Учитывая, что я не вижу, откуда DMkdir, и только контекст вашего другого кода, я предполагаю, что так же, как CDir его значение устанавливается асинхронно.

Предполагая, что вы используете последнюю версию узла, которая использует собственные обещания, такие как Node version 6 и выше, следующий код будет работать для вас. Если вы не используете более новую версию узла, вы можете использовать библиотеку обещаний, такую как bluebird или Q, которая будет включать в себя различный синтаксис, но она будет решена аналогичным образом.

function sshPromise (string) {
    new Promise((resolve, reject) => {
      ssh.exec(string, {
          // on correct output the promise needs to be 
          // resolved by calling the resolve function with the data
          out: resolve
          // not sure what the error property is but it needs 
          // to reject the promise with the error data
          onError: reject
      }).start();
    });
}

var CDirPromise = sshPromise('if test -d /home/' + GUSER + '; then echo "exist"; fi');

var DMkdirPromise = sshPromise('whatever command you did for this one obviously not this string');

Promise.all([CDirPromise, DMkdirPromise]).then(function ([CDir, DMKdir]) {
    // this then method will fire when all the promises resolve.
    if(CDir == DMkdir) {
        console.log("User on machine not adding......");
        ssh.exec('chown -R ' + GUSER + ':' + GUSER + ' /home/' + GUSER + '; su - ' + GUSER + ' -c "cd /home/' + GUSER + '/steamcmd ; screen -mdSL ' + SIP + ':' + SPORT + ' ./steamcmd.sh +login anonymous +force_install_dir /home/' + GUSER + '/' + SIP + '.' + SPORT + ' +app_update 4020 validate +quit"', {
            out: function(stdout) {
                //console.log(stdout);
            }
        }).start();             
    } else {
        console.log("User not on machine adding......");
        ssh.exec('cd /home/; sudo adduser ' + GUSER + ' --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password; echo "' + GUSER + ':' + RPassword + '" | sudo chpasswd; cd /home/' + GUSER + '/; mkdir steamcmd; cd /home/' + GUSER + '/steamcmd; wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz; tar -xvzf steamcmd_linux.tar.gz; chown -R ' + GUSER + ':' + GUSER + ' /home/' + GUSER + '; su - ' + GUSER + ' -c "cd /home/' + GUSER + '/steamcmd ; screen -mdSL ' + SIP + ':' + SPORT + ' ./steamcmd.sh +login anonymous +force_install_dir /home/' + GUSER + '/' + SIP + '.' + SPORT + ' +app_update 4020 validate +quit"', {
            out: function(stdout) {
                console.log(stdout);
            }
        }).start();
    }
}).catch(function (err) {
    // handle the error one of the promises rejected.
});

Вы также должны обрабатывать ошибки (при использовании ssh.exec должен быть способ обработать вывод ошибки. Я только догадывался, что это был onError но вы должны изменить его на то, что на самом деле есть. Я не знаю, какую библиотеку ssh вы поэтому я просто догадался, что это был onError.), поскольку кажется, что ваш код не проверяет наличие ошибок.

Я напишу немного о обещаниях. Они очень хороши для асинхронных событий, которые происходят один раз. Они также хорошо справляются с ошибками с этими асинхронными событиями. Обещание состоит из трех состояний: "ожидает", которое является незавершенным, "разрешено", которое является успешным завершенным состоянием, или отклонено, что является неудачным законченным состоянием, которое, вероятно, вызвано ошибкой. Вы можете обрабатывать разрешенные значения в обещании с помощью метода .then и обрабатывать отклоненные значения с .catch метода .catch.

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

Удачи. :)

РЕДАКТИРОВАТЬ:

Хорошо, согласно комментариям, проблема довольно проста. Все, что вам действительно нужно сделать, это следующее: просто запустить вашу функцию после того, как CDir доступен в свойстве ssh.exec.

ssh.exec('if test -d /home/' + GUSER + '; then echo "exist"; fi', {
    out: function (CDir) {
        if(CDir == DMkdir) {
            console.log("User on machine not adding......");
            ssh.exec('chown -R ' + GUSER + ':' + GUSER + ' /home/' + GUSER + '; su - ' + GUSER + ' -c "cd /home/' + GUSER + '/steamcmd ; screen -mdSL ' + SIP + ':' + SPORT + ' ./steamcmd.sh +login anonymous +force_install_dir /home/' + GUSER + '/' + SIP + '.' + SPORT + ' +app_update 4020 validate +quit"', {
                out: function(stdout) {
                    //console.log(stdout);
                }
            }).start();             
        } else {
            console.log("User not on machine adding......");
            ssh.exec('cd /home/; sudo adduser ' + GUSER + ' --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password; echo "' + GUSER + ':' + RPassword + '" | sudo chpasswd; cd /home/' + GUSER + '/; mkdir steamcmd; cd /home/' + GUSER + '/steamcmd; wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz; tar -xvzf steamcmd_linux.tar.gz; chown -R ' + GUSER + ':' + GUSER + ' /home/' + GUSER + '; su - ' + GUSER + ' -c "cd /home/' + GUSER + '/steamcmd ; screen -mdSL ' + SIP + ':' + SPORT + ' ./steamcmd.sh +login anonymous +force_install_dir /home/' + GUSER + '/' + SIP + '.' + SPORT + ' +app_update 4020 validate +quit"', {
                out: function(stdout) {
                    console.log(stdout);
                }
            }).start();
        }
    }
}).start();
  • 0
    DMkdir - это просто строка, которая просто удаляла бы обещание для того, что в обещании все изменило бы что-нибудь?
  • 0
    @RaulGonzales нет, на самом деле, если DMkdir не является значением, установленным во времени, это гораздо более простое решение. Так что это просто строка, но вы устанавливаете ее напрямую, а не в другое время?
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню