2017-10-17 533 views
3

我想写一个npm脚本来执行ssh shell命令。目前它正在通过执行osascript命令来打开终端窗口并运行该命令。从npm命令执行ssh shell脚本

我想改变它来执行当前终端的命令。该脚本包括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 [email protected][ip-address] eval $(base64 -D <<< [command in base64])

基于64位指令sudo docker exec -i -t $(sudo docker ps -aqf "ancestor=' + containerName + '") /bin/bash

如果我输出的命令和复制和粘贴,因为预期它会工作,进入远程机器并运行docker exec命令。

如果我删除-t选项,我不会收到警告消息,但控制台中没有输出并且脚本挂起(我假设它在后台运行没有输出的命令)。如果我删除eval ...部分,我会得到一个输出,看起来像您在切换到服务器时看到的内容,但没有输入终端。

我该怎么做才能在同一个终端或新选项卡中执行此命令。如果我必须使用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 [email protected]" + 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, 
    '[email protected]' + ip, 
    'eval', 
    'eval $(base64 -D <<< ' + encoded + ')' 
], { 
    stdio: 'inherit', 
    shell: true 
}); 

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

您可以发布您使用的代码吗? –

+0

@TarunLalwani希望可以帮助 – Ethan22

回答

1

我检查过它,它的shelljs.exec非TTY命令非常好。对于基于TTY的命令,您可以使用正常的派生方法。下面是一个很适合我的示例代码

var spawn = require('child_process').spawn; 

var sshTerm = spawn('ssh', ["[email protected]", ""], { 
    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 
    } 
}); 
+0

感谢您的回复,我会在今天晚些时候对此进行测试并回复您! – Ethan22

+0

这是一个很大的帮助,但我得到了另一个错误。你能看看我的编辑2,看看你的想法吗? – Ethan22

+0

尝试在''ubuntu @'+ ip之前添加''-tt',',' –