从npm命令执行ssh shell脚本

3
我正在尝试编写一个npm脚本,用于执行ssh shell命令。目前它通过执行osascript命令来打开终端窗口并运行命令。我想将其更改为在当前终端中执行命令。该脚本包含shelljsexecutive两个模块。当我使用executive时,脚本会无任何反应地结束。使用shelljs时,我会收到以下错误信息:Pseudo-terminal will not be allocated because stdin is not a terminal. the input device is not a TTY
要执行的命令是:ssh -i [ssh-key] -t ubuntu@[ip-address] eval $(base64 -D <<< [command in base64])。其中base64命令是:sudo docker exec -i -t $(sudo docker ps -aqf "ancestor=' + containerName + '") /bin/bash。如果我输出该命令并复制粘贴它,它将按预期工作,即SSH到远程机器并运行docker exec命令。如果我删除-t选项,则不会收到警告消息,但控制台没有输出,脚本会挂起(我认为它在后台运行命令而没有输出)。如果我删除eval ...部分,我将得到一个看起来像SSH到服务器时看到的输出,但没有输入终端。
我该如何在同一终端或新标签页中执行此命令?如果必须使用osascript命令来执行此操作,那也可以。不过我将从PhpStorm的终端中执行此命令。 编辑 以下是代码块:
var execCommand = 'sudo docker exec -i -t $(sudo docker ps -aqf "ancestor=nginx") /bin/bash';

var buffer = new Buffer(execCommand);
var encoded = buffer.toString('base64');

var cmd = "ssh -i " + this.keyPath + " -t ubuntu@" + ip + " eval $(base64 -D <<< " + encoded + ") ";

shell.exec(cmd);

编辑2

我可以成功地通过ssh进入机器并获得命令提示符,但是当我加入eval命令时,现在出现了一个“输入设备不是TTY”的错误。

var docker_exec = 'sudo docker exec -it $(sudo docker ps -aqf "ancestor=' + containerName + '") /bin/bash';
var encoded = new Buffer(docker_exec).toString('base64');

var sshTerm = spawn('ssh', [
    '-i',
    this.keyPath,
    'ubuntu@' + ip,
    'eval',
    'eval $(base64 -D <<< ' + encoded + ')'
], {
    stdio: 'inherit',
    shell: true
});

sshTerm.on('exit', function() {
    process.exit(0);
});

{btsdaf} - Tarun Lalwani
@TarunLalwani hope that helps - Ethan22
1个回答

1
我检查过了,shelljs.exec适用于非TTY命令。对于基于TTY的命令,您可以使用普通的spawn方法。以下是一个对我非常有效的示例代码。
var spawn = require('child_process').spawn;

var sshTerm = spawn('ssh', ["vagrant@192.168.33.100", ""], {
  stdio: 'inherit'
});

// listen for the 'exit' event
//   which fires when the process exits
sshTerm.on('exit', function(code, signal) {
  if (code === 0) {
    // process completed successfully
  } else {
    // handle error
  }
});

{btsdaf} - Ethan22
{btsdaf} - Ethan22
{btsdaf} - Tarun Lalwani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接