我有一个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的结果中提取目录列表?
有人可以帮我吗?
答案 0 :(得分:2)
因此,如果您的目标是通过ssh列出远程系统上文件夹的内容,请注意这可以通过多种方式完成。使用child_process
和shell脚本即可,但您也可以使用node-control或mscdex/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
,但请从此开始。