簡體   English   中英

如何使用 NodeJS 在 SSH2 上執行多個命令

[英]How execute multiple commands on SSH2 using NodeJS

我正在嘗試從 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腳本,它具有多行的所有功能,而不是單個斷開連接的命令列表。

查看使用ssh2的sftp函數將完整的shell腳本作為步驟1傳輸到遠程計算機,通過exec/bin/bash /tmp/your_deploy_script.sh )執行它作為步驟2,然后將腳本刪除為步驟3。

我知道這是一個超級老問題,但我在嘗試通過我的Node服務器管理ACE時遇到了這個問題。 答案對我來說不起作用,但后來幾次搜索讓我找到了一個對我來說非常好的包裝器。 只是想在這里分享,因為這是我的Google搜索中的頂級鏈接。 它叫做ssh2shell,可以在這里找到: https ://www.npmjs.com/package/ssh2shell

它使用起來非常簡單,只需傳遞一個命令數組,它們一個接一個地運行,等待每個命令完成,然后繼續下一個命令。

你不能在程序中使用“shell”,因為“Shell”命令會在系統上調用一個新的終端並執行你的jop。 你需要使用“exec”命令而不發出“退出” 默認的“exec”命令在您執行的命令執行后發出“exit”命令。

一個實際例子:

  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() ,這會導致創建新會話而不是使用當前會話。

Linux中的命令鏈

我知道這個問題的答案已被接受,但對於可能也想看到命令鏈(在 linux 中)的觀眾可以參考以下鏈接。 我遇到了類似的問題,我通過命令鏈接實現了它。

https://www.howtogeek.com/269509/how-to-run-two-or-more-terminal-commands-at-once-in-linux/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM