在Node Js中调用Shell脚本

时间:2014-04-07 16:10:57

标签: node.js shell

我有一个Node Js程序,它有三个部分。

第一部分执行并返回IP和用户 第二部分是调用以下的shellcript

   #!/bin/bash
    IP=$1
    User=$2
    ssh -i /Users/cer.pem ubuntu@$IP "cd /home/$ && ls -lth" >> /Users/outcome.txt

成功创建outcome.txt后,我必须在第三部分继续做其他事情。

我找到了两个与Run shell script with node.js (childProcess)& Node.js Shell Script And Arguments,但这些并不是解决我的问题,因为它没有谈论处理shellrcipt的同步性质。

有关如何真正使用child_process的更多信息真的会有所帮助。 1)如何将IP和用户传递给嵌入shellscript的第二个节点模块? 2)如何从shellscript的结果中提取目录列表?

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

因此,如果您的目标是通过ssh列出远程系统上文件夹的内容,请注意这可以通过多种方式完成。使用child_process和shell脚本即可,但您也可以使用node-controlmscdex/ssh2(可能还有许多其他人)。

但无论如何,当远程工作完成时,您的节点代码将继续异步执行。即使您的脚本是同步的,您也必须异步地在node.js代码中编写控制流逻辑。

从一些基本的嵌套回调开始。

function getIpAndUser(callback) {
  //get them then do
  callback(null, ip, user);
}

function listDirectory(ip, user, callback) {
  //do your child_process.exec here
  //eventually call
  callback(null, output)
}

function thirdPart() {

}

//combine them together correctly:

getIpAndUser(function (error, ip, user) {
  if (error) {
    console.error(error);
    return;
  }
  listDirectory(ip, user, function () {
    if (error) {
      console.error(error);
      return;
    }
    thirdPart();
  });
});
}

如果您愿意,可以使用async.js或promises库重写控制流,如果您愿意的话。

在评论中解决您的其他问题:

1)child_process.exec('list_dir.sh ' + ip + ' ' + user, callback)

请注意,您最终应该正确地转义这些参数,并可能切换到child_process.execFile,但请从此开始。

2)他们在the example that is right there in the documentation

中的表现