如何使用NodeJS在SSH2上执行多个命令

我试图部署从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到正确的目录后,它忘记了它是什么,并重新开始。

 $ cd /some/folder && pwd /some/folder $ pwd /root 

@robertklep是正确的,为什么你的cd不会持续。 每个命令都会调用一个以初始状态启动的独立shell实例。 你可以用cd /home/jansenstok/domains/alcoholtesterwinkel.com/public_html/ &&作为一个快速修复的前缀,每个命令,但你真的设置自己的痛苦。 你想要的是一个shell脚本,具有多行的所有function,而不是一个单独的断开命令的列表。

看看如何使用ssh2的sftp函数将完整的shell脚本传输到远程机器(如步骤1),通过exec/bin/bash /tmp/your_deploy_script.sh )作为步骤2,然后删除脚本作为步骤3。

我知道这是一个超级老问题,但是我尝试通过Node服务器pipe理ACE时遇到了这个问题。 答案并不适用于我,但后来几次search使我find了一个对我来说真的很好的包装。 只是想在这里分享,因为这是我的谷歌search的顶部链接。 这就是所谓的ssh2shell,可以在这里find: https ://www.npmjs.com/package/ssh2shell

使用起来非常简单,只需传递一组命令,然后逐个运行,等待每个命令完成后再进入下一个命令。

你不会在你的程序中使用“shell”,因为“Shell”命令在系统上调用一个新的terminal并执行你的jop。 你需要使用“exec”命令而不发出“exit” 。 执行命令后,默认的“exec”命令会发出“exit”命令。