从 npm 命令执行 ssh shell 脚本
Execute ssh shell script from npm command
我正在尝试编写一个 npm 脚本来执行 ssh shell 命令。目前它通过执行 osascript
命令打开终端 window 和 运行 命令来工作。
我想将其更改为在当前终端中执行命令。该脚本包括 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
如果我输出命令并复制和粘贴它,它将按预期工作,sshing 到远程机器并 运行ning 一个 docker exec
命令。
如果我删除 -t
选项,我不会收到警告消息,但控制台中没有输出并且脚本挂起(我假设它是 运行 在后台使用命令无输出)。如果我删除 eval ...
部分,我得到的输出看起来就像您在没有输入终端的情况下通过 sshing 进入服务器时看到的那样。
如何在同一终端或新选项卡中执行此命令。如果我必须使用 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);
});
我检查了一下 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
}
});
我正在尝试编写一个 npm 脚本来执行 ssh shell 命令。目前它通过执行 osascript
命令打开终端 window 和 运行 命令来工作。
我想将其更改为在当前终端中执行命令。该脚本包括 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
如果我输出命令并复制和粘贴它,它将按预期工作,sshing 到远程机器并 运行ning 一个 docker exec
命令。
如果我删除 -t
选项,我不会收到警告消息,但控制台中没有输出并且脚本挂起(我假设它是 运行 在后台使用命令无输出)。如果我删除 eval ...
部分,我得到的输出看起来就像您在没有输入终端的情况下通过 sshing 进入服务器时看到的那样。
如何在同一终端或新选项卡中执行此命令。如果我必须使用 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);
});
我检查了一下 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
}
});