3

我正在尝试编写一个将执行 ssh shell 命令的 npm 脚本。目前它通过执行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

如果我输出命令并复制并粘贴它,它将按预期工作,连接到远程机器并运行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 进入机器并获得命令提示符,但the input device is not a TTY现在添加eval命令时出现错误。

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);
});
4

1 回答 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
  }
});
于 2017-10-23T05:43:33.637 回答