【问题标题】:ssh2 connect to multiple server and get the output nodejsssh2 连接到多个服务器并获取输出 nodejs
【发布时间】:2017-01-12 12:59:12
【问题描述】:

我正在使用 ssh2 nodejs 模块连接到 UNIX 应用程序并运行脚本,它是成功的。 现在我想一一连接到多个服务器并获取输出并存储它。 当我尝试使用for循环将服务器从json作为输入一个接一个地传递到ssh2时,for循环的完成速度比应该从服务器获取输出的块快得多。 这也导致我握手错误。 请帮忙

这里是代码

inc_cron.schedule("*/20 * * * * *", function(id) {    
        });

//inc_cron.js

var cronFunction = function(inputStr) { 
                  if(appNames['applications'].length>0){ 
                                for (i = 0; i < appNames["applications"].length; i++) {  
                                  getDataFromServer(appNames["applications"][i].Name,appNames["applications"][i].hostname, appNames["applications"][i].username, appNames["applications"][i].password, appNames["applications"][i].log_path, function(err, data) { 
                                                if(err) {
                                                  logger.info("Error is in cronFunction = ", err);
                                                } else if(data) { 
                                                                output_data +=data;   
                                                }  ssh.close_second();
                                  }); 
                                } 
                }  
}

var getDataFromServer = function(Name,hostname, username, password, log_path, cb) { 
  ssh.close_second();
  ssh.connect_second({
    host: hostname,
    username: username,
    password: password
  }, function(err) {
    if(err) {
      logger.error('Err: ', err);
    } else {  
                                ssh.sftp("",'grep -o "ERROR" '+log_path+'.log.'+yr+'-'+mnth+'-* | wc -l', function(err, data) {
                                                      cb(err, data); 
                                });     }   });  }


//connect.js

SSHConnection.prototype.sftp = function(type, path,  cb) {
  var self = this;
  var log_data = '';
  self.connection2.exec(path +' ' + type,  { pty: true }, function(err, stream) {
                if (err) {
      logger.log('SECOND :: exec error: ' + err); 
    }
                stream.on('end', function() {
      self.connection2.end(); // close parent (and this) connection
    }).on('data', function(data) {
      logger.info(data.toString());
    });
                  }); 
};

【问题讨论】:

  • 你能告诉我们你到目前为止的代码吗?
  • @HolgerWill 我现在已经添加代码了吗...

标签: javascript node.js unix ssh2-sftp connect.js


【解决方案1】:

如果不看你的代码,请务必正确处理 ssh2 的异步问题...使用承诺工厂。

【讨论】:

  • node-ssh 可能是使用这个带有承诺的库的最佳方法。
【解决方案2】:

一种方法是使用 es7 async await。为此,您必须重写您的 getDataFromServer 函数以返回一个承诺:

var getDataFromServer = function(Name,hostname, username, password, log_path, cb) { 
    return new Promise(function(resolve,reject){
        ssh.close_second();
        sh.connect_second({
            host: hostname,
            username: username,
            password: password
        },function(err) {
            if(err){
                reject(err)
            }else{
                ssh.sftp("",'grep -o "ERROR" '+log_path+'.log.'+yr+'-'+mnth+'-* | wc -l', function(err, data) {
                    if(err){
                        reject(err)
                    }else{ 
                        resolve(data)
                    }
                })
            }
        })
    })
}

现在您可以将 cron 函数重写为异步函数。

var cronFunction = async function(inputStr) { 
    if(appNames['applications'].length>0){ 
        for (i = 0; i < appNames["applications"].length; i++) {
            try{
                output_data + = await getDataFromServer(appNames["applications"][i].Name,appNames["applications"][i].hostname, appNames["applications"][i].username, appNames["applications"][i].password, appNames["applications"][i].log_path)
            }catch(err){
               logger.info("Error is in cronFunction = ", err);
            }
            ssh.close_second();
        }
    } 
}

async await 使您能够以同步编码风格编写异步代码。 然而,异步等待当前(节点 7.*)隐藏在标志(--harmony-async-await)后面。此功能将在 2017 年 4 月即将发布的节点版本 (8.0.0) 中默认启用。

所以要启动您当前必须使用的应用程序

node --harmony-async-await yourapp.js

P.S.:此代码目前未经测试,很可能包含错误.. 但你明白了。

【讨论】:

  • 谢谢......会尝试...... :) 另外我忘了提到我面临的另一个错误...... for 循环工作了大约 20 次......并且一旦计数达到 20 ....我得到一个 HandShanke 错误.......对此有什么建议吗???
  • async await 也应该去掉,因为总是只有一个打开的连接。
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2019-10-29
  • 2019-12-28
相关资源
最近更新 更多