【发布时间】:2018-03-29 10:50:57
【问题描述】:
我正在尝试编写一个将执行 ssh shell 命令的 npm 脚本。目前,它通过执行osascript 命令来打开终端窗口并运行该命令。
我想更改它以在当前终端中执行命令。该脚本包括shelljs 和executive。当我使用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 进入机器并获得命令提示符,但现在当我添加 eval 命令时出现the input device is not a 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);
});
【问题讨论】:
-
能贴出你用过的代码吗?
-
@TarunLalwani 希望对您有所帮助
标签: bash npm osascript shelljs