【问题标题】:Nodejs SSH2 connect multiple timesNodejs SSH2连接多次
【发布时间】:2014-06-01 04:17:47
【问题描述】:

我想连接到远程机器并在该机器上执行一个 shell 命令。我可以上传文件并成功执行命令。但我只能做一次。我希望能够多次这样做。

下面是我使用 SSH2 模块的 JS 文件。

                var Connection = require('ssh2');
            var fs = require('fs');

            c = new Connection();
            c.on('ready', function() {
              console.log('Connection :: ready');

              c.sftp(
                        function (err, sftp) {
                            if ( err ) {
                                console.log( "Error, problem starting SFTP: %s", err );
                                //process.exit( 2 );
                            }

                            console.log( "- SFTP started" );


                            sftp.unlink( "testfile.py", function(err){ 

                                if ( err ) {
                                    console.log( "Error, problem starting SFTP: %s", err );
                                    //process.exit( 2 );
                                }
                                else
                                {
                                    console.log( "file unlinked" );
                                }

                            });

                            // upload file
                            var readStream = fs.createReadStream( "testfile.py" );
                            var writeStream = sftp.createWriteStream( "testfile.py" );


                            writeStream.on('end', function () {

                                console.log( "sftp connection closed" );

                              });


                            // what to do when transfer finishes
                            writeStream.on(
                                'close',
                                function () {

                                    console.log( "- file transferred" );

                                    sftp.chmod( "testfile.py", 777, function(err){ 

                                        if ( err ) {
                                            console.log( "Error, problem starting SFTP: %s", err );
                                            //process.exit( 2 );
                                        }
                                        else
                                        {
                                            console.log( "Mode changed" );
                                        }

                                    });



                                    //execute the program
                                    c.exec('python testfile.py', function(err, stream) {

                                        if (err) throw err;
                                        stream.on('data', function(data, extended) {
                                          console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ')
                                                      + data);
                                        });
                                        stream.on('end', function() {
                                          console.log('Stream :: EOF');
                                        });
                                        stream.on('close', function() {
                                            console.log('Stream :: close');

                                            // close the ftp connection
                                            sftp.end();
                                            // fs.end();
                                            //process.exit( 0 );

                                        });
                                        stream.on('exit', function(code, signal) {
                                          console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal);
                                          //c.end();
                                        });
                                      });





                                }
                            );

                            // initiate transfer of file
                            readStream.pipe( writeStream );
                        }
                    );





            });
            c.on('keyboard-interactive', function(name, instructions, instructionsLang, prompts, finish) {
              console.log('Connection :: keyboard-interactive');
              finish(['pwd']);
            });
            c.on('error', function(err) {
              console.log('Connection :: error :: ' + err);
            });
            c.on('end', function() {
              console.log('Connection :: end');
            });
            c.on('close', function(had_error) {
              console.log('Connection :: close');
            });
            c.connect({
              host: 'host',
              port: 22,
              username: 'uname',
              password: 'pwd',
              tryKeyboard: true
            });

【问题讨论】:

  • 您是在谈论生成子进程吗? nodejs.org/api/child_process.html
  • 其实没有。我想再次运行相同的脚本。但是,连接没有再次进入“就绪”状态。我每次都在创建新的连接,所以我看不到可能是什么问题。
  • 你能把它全部包装在一个函数中,你可以在“关闭”时再次调用它,并在你想要运行它的次数之外实现一个计数器吗?
  • 感谢您指引我正确的方向。我实际上已经在不同的文件中编写了这个脚本,并从另一个文件中调用“require('./ssh2.js')”。这就是它没有再次被执行的原因。现在我已将整个脚本封装在一个函数中,我只是调用该函数。

标签: javascript node.js express ssh sftp


【解决方案1】:

ssh2 v0.2.22 应该对连接实例重用有更好的支持。如果您遇到任何问题,请随时发布issue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多