5

我正在尝试使用我想按数组顺序执行多个命令从 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
4

4 回答 4

6

@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。

于 2014-01-03T16:46:53.813 回答
2

我知道这是一个非常古老的问题,但我在尝试通过我的节点服务器管理 ACE 时遇到了这个问题。答案对我不起作用,但后来几次搜索让我找到了一个非常适合我的包装器。只是想在这里分享,因为这是我 Google 搜索中的顶部链接。它被称为 ssh2shell,可以在这里找到:https ://www.npmjs.com/package/ssh2shell

它使用起来非常简单,只需传递一组命令,它们就会一个接一个地运行,等待每个命令完成,然后再继续下一个。

于 2016-08-10T20:30:18.880 回答
1

一个实际的例子:

  const client = new Client();
  const cmds = [
    'ls -lah \n',
    'cd /mnt \n',
    'pwd \n',
    'ls -lah \n',
    'exit \n',
  ];
  client.on('ready', () => {
      console.log('Client :: ready');
      client.shell((err, stream) => {
        stream.on('close', (code) => {
          console.log('stream :: close\n', { code });
        }).on('data', (myData) => {
          console.log('stream :: data\n', myData.toString());
        }).on('exit', (code) => {
          console.log('stream :: exit\n', { code });
          client.end();
        }).on('error', (e) => {
          console.log('stream :: error\n', { e });
          rej(e);
        });
        for (let i = 0; i < cmds.length; i += 1) {
          const cmd = cmds[i];
          stream.write(`${cmd}`);
        }
      });
    }).connect({
    host: '127.0.0.1',
    port: 22,
    username: 'root',
    password: 'root',
  });

文档中的所有示例都使用stream.end()导致创建新会话而不是使用当前会话。

于 2021-09-08T11:43:03.137 回答
0

你很酷不要在你的程序上使用“shell”,因为“shell”命令会调用系统上的一个新终端并完成你的工作。您需要使用 "exec" 命令而不发出 "exit"。默认的“exec”命令在您给出的命令执行后发出“exit”命令。

于 2014-07-25T11:43:23.603 回答