Попытка создания файлов и т.д. На новых 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;
}
Я предполагаю, что все правильно, кроме вашей проблемы с обработкой двух асинхронных событий. Учитывая, что я не вижу, откуда 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();