我正在尝试从GitHub部署,我希望按照数组的顺序执行多个命令。我现在使用的代码包含在下面。
async.series([
...
// Deploy from GitHub
function (callback) {
// Console shizzle:
console.log('');
console.log('Deploying...'.red.bold);
console.log();
console.log();
var deployFunctions = [
{
command: 'cd ' + envOptions.folder + ' && pwd',
log: false
},
{
command: 'pwd'
},
{
command: 'su ' + envOptions.user,
log: false
},
{
command: 'git pull'
},
{
command: 'chmod 0777 * -R',
log: false
}
];
async.eachSeries(deployFunctions, function (item, callback) {
deployment.ssh2.exec(item.command, function (err, stream) {
deployment.logExec(item);
stream.on('data', function (data, extended) {
console.log(data.toString().trim());
console.log();
});
function done() {
callback(err);
}
stream.on('exit', done);
stream.on('end', done);
});
}, function () {
callback();
});
},
...);
但是,在我进入正确的目录后,它会忘记它的位置并重新开始。
$ cd /some/folder && pwd
/some/folder
$ pwd
/root
答案 0 :(得分:5)
@robertklep对于cd
为什么不会持续存在是正确的。每个命令都调用一个以其初始状态开始的独特shell实例。您可以使用cd /home/jansenstok/domains/alcoholtesterwinkel.com/public_html/ &&
为每个命令添加前缀作为快速修复,但实际上您正在为痛苦做好准备。你想要的是一个shell脚本,它具有多行的所有功能,而不是单个断开连接的命令列表。
使用ssh2' sftp
函数将完整的shell脚本作为步骤1传输到远程计算机,然后通过exec
(/bin/bash /tmp/your_deploy_script.sh
)执行第2步,然后在步骤3中删除脚本。
答案 1 :(得分:2)
我知道这是一个超级老问题,但在尝试通过我的Node服务器管理ACE时遇到了这个问题。答案对我来说不起作用,但后来几次搜索让我找到了一个对我来说非常好的包装器。只是想在这里分享,因为这是我的Google搜索中的顶级链接。它叫做ssh2shell,可以在这里找到:https://www.npmjs.com/package/ssh2shell
使用起来非常简单,只需传递一组命令,它们一个接一个地运行,等待每个命令完成,然后继续下一个命令。
答案 2 :(得分:0)
你不能在你的程序中使用“shell”,因为“Shell”命令会调用系统上的新终端并执行你的jop。您需要使用“exec”命令而不会发出“退出”。默认的“exec”命令在您执行的命令执行后发出“exit”命令。