【问题标题】:nodejs execute command on remote linux servernodejs在远程linux服务器上执行命令
【发布时间】:2019-07-24 18:41:29
【问题描述】:

从 nodejs 我一直在尝试在远程服务器上执行 linux 命令并获取流中的输出以供进一步处理。为了连接到远程 linux 服务器,我拥有所有必要的详细信息,例如 serverip、用户名和密码。我在网上搜索了很多,发现这可以通过 ssh 来实现。

Can Nodejs ui page run shell cmd to remote machine and run script

但这个答案有点令人困惑,我不知道如何在连接中使用密码。

指向任何工作示例都会有很大帮助。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    我自己解决了这个问题。有一个 npm 包 (ssh-exec) 可用于 ssh 命令执行。下面是我使用的代码。

    var exec = require('ssh-exec')
    var v_host = 'XX.XX.XX.XXX'
    exec('ls -lh', {
      user: 'root',
      host: 'XX.XX.XX.XXX', 
      password: 'password'
    }).pipe(process.stdout , function (err, data) {
        if ( err ) { console.log(v_host); console.log(err); }
      console.log(data)
    })
    

    【讨论】:

    • 这不起作用在事件类上一直给我一个错误“抛出错误”
    • @Nikhil,希望您已经使用 Putty 验证了连接性。请确认。
    • 是的,我做到了,但它仍然不起作用。不过,我找到了更好的解决方案。
    • 我想弄清楚的等待/异步语​​法是什么?
    • @usersam 是否可以在没有 ssh 连接的情况下做到这一点?我在 php 中搜索类似 weavely 的东西
    【解决方案2】:

    我还使用了另一个包“simple-ssh”来解决这个问题。它使用起来非常简单,并且可以很好地控制输出,可以像流一样使用。

    var SSH = require('simple-ssh');
    
    var ssh = new SSH({
        host: 'XX.XX.XX.XXX',
        user: 'username',
        pass: 'password'
    });
    
    ssh.exec('ls -lh', {
        out: function(stdout) {
            console.log(stdout);
        }
    }).start();
    

    并按需结束执行

    ssh.end();
    

    这里的 ssh 只不过是我们之前声明的新 SSH。

    【讨论】:

    • 在此处提到的前三个中,这是唯一一个在 2021 年左右无需修复任何东西的工作。
    • 我似乎对The authenticity of host 'xx.xx.xxx.xxx' can't be established. 有问题并且对于所有nodejs ssh 包,代码只是挂起。我从命令行尝试过,它问我是否信任主机,在从命令行输入yes ssh work 但我如何将yes 这个与nodejs 一起使用?
    • simple-ssh 不再维护。
    【解决方案3】:

    Node 带有这个默认库“remote-exec”,可用于远程 ssh。它对我有用。

    var rexec = require('remote-exec');
    
    module.exports = function (context, req) {
        var connection_options = {
        port: 443,
        username: 'yourusername',
        password: 'yourpassword'
        };
    
        var hosts = [
            'yourhostname.com'
        ];
    
        var cmds = [
         'ls -lh'
        ];
    
        rexec(hosts, cmds, connection_options, function(err){
            if(err){
                context.log(err);
            }else{
             context.log("Success!!");
            }
        });
    };
    

    【讨论】:

    • 是的,这也有效,但我也使用了“simple-ssh”,我感觉比这更好。我建议试一试。无论如何,我一直在努力以同样的方式在远程 WINDOWS 服务器上执行命令,而没有对远程 m/c 进行太多更改。如果您遇到过一些 node.js 解决方案,请告诉我。谢谢
    • 我不认为“Node 带有这个默认库'remote-exec'”是真的——我认为你必须安装它,因为它似乎是由一个名叫 tpresley 的人提供的(github.com/tpresley/node-remote-exec)。当我的脚本包含 require('remote-exec'); 时,我收到“错误:找不到模块 'remote-exec'”,因为默认情况下 Node.js 不附带此库。
    【解决方案4】:

    在寻找在远程 [aws] Linux 服务器上执行脚本的解决方案时遇到了这篇文章。使用 ssh2 包,下面的代码运行良好 -

    var Client = require('ssh2').Client;
    
    var conn = new Client();
    conn.on('ready', function() {
      console.log('Client :: ready');
    
      // const cmd = 'uptime';
      const cmd = 'ls -l /tmp | grep jetty';
    
      conn.exec(cmd , function(err, stream) {
        if (err) throw err;
        stream.on('close', function(code, signal) {
          console.log('SSH Stream :: close :: code: ' + code + ', signal: ' + signal);
          conn.end();
        }).on('data', function(data) {
          console.log('STDOUT: ' + data);
        }).stderr.on('data', function(data) {
          console.log('STDERR: ' + data);
        });
      });
    }).connect({
      host: 'ec2-##-###-###-###.ap-xxxx-1.compute.amazonaws.com',
      username: 'xyz',
      privateKey: require('fs').readFileSync('../my_private.ppk')
    });
    

    参考:https://www.npmjs.com/package/ssh2
    也使用npm i ssh2安装ssh2

    上述示例运行:

    E:\nodejs>node ex-ssh2.js
    Client :: ready
    STDOUT: drwxr-xr-x 2 jenkins jenkins    4096 Jul 17 13:35 jetty-0.0.0.0-8080-war-_-any-3087978102711715755.dir
    
    SSH Stream :: close :: code: 0, signal: undefined
    

    【讨论】:

    • 这可能是一个不错的选择,但是传递命令参数呢?像 "simple-ssh" 给出选项 "args: [arg1, arg2, ..]"
    • 在上面的例子中,cmd 有参数'ls -l /tmp | grep jetty';而 simple-ssh 具有高级选项,例如运行命令队列。但是,如果需要在远程 m/c 上执行可以选择带参数的脚本,ssh2 应该没问题
    猜你喜欢
    • 2020-09-14
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2015-04-24
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多