我正在尝试运行并从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,它运行正常。经过一些测试后我觉得它是\ _字符的东西但是对于这个特定的命令我必须在字符串上使用引号。
答案 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')
});