【发布时间】:2014-01-21 07:52:25
【问题描述】:
我正在尝试从 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'ed 到正确的目录后,它忘记了它的位置并重新开始。
$ cd /some/folder && pwd
/some/folder
$ pwd
/root
【问题讨论】:
-
但这并没有描述如何一个接一个地执行更多的命令,是吗?
-
命令按顺序运行,并且可能每个都在不同的 shell 实例中,这意味着环境中的任何更改(如当前工作目录)都不是“粘性”。也许使用
.shell而不是.exec,尽管您可能必须重写执行命令的方式(或在每个命令前加上cd ... &&)。 -
您建议如何使用
.shell?我似乎找不到太多使用 node-ssh2 模块的例子,所以很难掌握它应该如何(正确地)使用。 -
这里有一些想法:gist(恐怕不是特别漂亮)。您可能希望将
async循环移动到.shell处理程序内部。 -
一种解决方案是使用
'cd ' + envOptions.folder + ' && pwd'扩展您所拥有的内容,以构建一个包含您要执行的所有命令的字符串。回想一下,您可以使用;、&&(如您所知)和||分隔 cmd。祝你好运。
标签: javascript node.js shell ssh node-modules