我试图编写一个npm脚本来执行ssh shell命令。目前它通过执行osascript
命令来打开终端窗口并运行该命令。
我想更改此项以在当前终端中执行命令。脚本同时包含shelljs
和executive
。当我使用executive
时,脚本不会发生任何事情。我得到:shelljs
正在执行的命令是:Pseudo-terminal will not be allocated because stdin is not a terminal.the input device is not a TTY
base64命令ssh -i [ssh-key] -t ubuntu@[ip-address] eval $(base64 -D <<< [command in base64])
如果我输出命令并复制粘贴它,它将按预期工作,进入远程计算机并运行sudo docker exec -i -t $(sudo docker ps -aqf "ancestor=' + containerName + '") /bin/bash
命令。
如果删除docker exec
选项,则不会收到警告消息,但控制台中没有输出,脚本将挂起(我假设它在后台运行命令,但没有输出)。如果我删除-t
部分,我会得到一个输出,它看起来就像您在服务器中切换时看到的那样,但是没有输入终端。
如何在同一终端或新选项卡中执行此命令。如果必须使用eval ...
命令来执行此操作,也可以。不过,我将从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到机器中并获得命令提示符,但是现在添加
osascript
命令时出现了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);
});
最佳答案
我检查过了,它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
}
});
关于bash - 从npm命令执行ssh shell脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46795343/