为什么Nexpect上的这个SSH命令不起作用?

时间:2014-07-10 14:12:22

标签: node.js ssh expect docker

我正在尝试运行并从docker容器中获取有关docker容器的信息,为此我使用的是Nexpect,但我发现了一个奇怪的错误:

exports.getIP = function(username, callback){
   var nexpect = require('nexpect');
   nexpect.spawn("ssh core@172.17.8.101 \"docker inspect --format '{{ .NetworkSettings.IPAddress }}' " + username + "\"")
         .expect(" ")
         .run(function (err, stdout, exitcode) {
             if (err) {
                 callback(err);
             }
           console.log("inside = " + stdout);
           ip = stdout;

           callback(null, ip);
    });
};

此方法的错误响应是“错误:找不到命令:ssh”

但如果我在shell中手动运行:

ssh core@172.17.8.101 "docker inspect --format '{{ .NetworkSettings.IPAddress }}' test"

完美无缺。

我也有非常类似的功能来使用Nexpect和SSH运行Docker,它运行正常。经过一些测试后我觉得它是\ _字符的东西但是对于这个特定的命令我必须在字符串上使用引号。

1 个答案:

答案 0 :(得分:0)

您可以使用ssh2 module代替生成子进程并使用nexpect

var Connection = require('ssh2');

var ssh = new Connection();
ssh.on('ready', function() {
  ssh.exec("docker inspect --format '{{ .NetworkSettings.IPAddress }}' test", function(err, stream) {
    if (err)
      throw err;

    stream.on('exit', function(code, signal) {
      console.log('>> Docker exited with code %d, signal %s', code, signal);
    }).on('close', function() {
      // this indicates that there is no more stdout/stderr output,
      // just like with node's spawn()
      ssh.end();
    }).pipe(process.stdout);

    stream.stderr.pipe(process.stderr);
  });
}).connect({
  host: '172.17.8.101',
  username: 'core',
  agent: process.env.SSH_AUTH_SOCK,
  // or if you have a specific key you want to use:
  //privateKey: require('fs').readFileSync(process.env.HOME + '/.ssh/id_rsa')
});