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

jer*_*101 5 javascript ssh shell node.js node-modules

我正在尝试从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();
    });
},
...);
Run Code Online (Sandbox Code Playgroud)

但是,在我进入正确的目录后,它会忘记它的位置并重新开始.

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

$ pwd
/root
Run Code Online (Sandbox Code Playgroud)

Pet*_*ons 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.