承诺在Node.js进程中运行Python脚本的child_进程在所有数据之前退出

2024-09-23 16:33:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试让sublist3r在节点应用程序中运行。但是,它运行时只显示横幅,然后在大约5秒钟后退出。该脚本应该可以访问web,运行大约需要30秒。如果我不使用承诺,它会很好地工作。它是否与pyrog.stdout.on('data')在输出之前不等待有关?我读了很多书,尝试了{},但运气不好

this article上尝试了一切,如果它不涉及编辑python脚本的话(我不认为我应该这么做?!)

还可以阅读Node.js Child Process,但它没有提到对spawn使用承诺,我相信这就是运行Python脚本所需要的

sublist3r screen shot

我使用的承诺是错误的吗

非常感谢您的帮助

编辑:添加了等待到runPy,验证了相同的问题。我们也尝试过将其变为变量,let test = await runPy ...但没有成功

var express = require('express');
var router = express.Router();

let runPy = new Promise((success, nosuccess) => {
    const {spawn} = require('child_process')
    const pyprog = spawn('python',['/path/to/sublist3r.py', '-d', 'domain.com'] )

    pyprog.stdout.on('data', (data) => {
        success(data)
    })

    pyprog.stderr.on('data', (data) => {
        nosuccess(data)
    })

    pyprog.on('close', (code) => {
        console.log(`child process ended with ${code}`);
    })
})


/* GET home page. */
router.get('/', async (req, res) => {

    // EDIT:  Added await and verified same issue.
    await runPy.then(fromRunPy => {
        console.log(fromRunPy.toString());
    })

    // It works fine below, but I want a promise for no other reason that I can't get it to work...
    // const { spawn } = require('child_process');
    // const pyProg = spawn('python', ['/home/wayne/BugHunterJS/controllers/Sublist3r/sublist3r.py', '-d', req.body.domain]);
    
    // console.log('inside post');
    // pyProg.stdout.on('data', function(data) {
    //     let sublist3rData = data.toString();
    //     console.log(sublist3rData);
    // });

  });

module.exports = router

Tags: 脚本logdataonstdoutrequireawaitconsole
1条回答
网友
1楼 · 发布于 2024-09-23 16:33:41

在我询问之后不久,我发现了一个解决方案,如果有人在寻找的话。我还是不太确定它是怎么工作的,以后再弄清楚。我认为把它推到阵列是关键

const {
    spawn
} = require('child_process')
const logOutput = (name) => (data) => console.log(`[${name}] ${data}`)


function run() {
    return new Promise((resolve, reject) => {
        const process = spawn('python', ['/path/sublist3r.py', '-d', 'domain.com']);

        const out = []
        process.stdout.on(
            'data',
            (data) => {
                out.push(data.toString());
                logOutput('stdout')(data);
            }
        );

        const err = []
        process.stderr.on(
            'data',
            (data) => {
                err.push(data.toString());
                logOutput('stderr')(data);
            }
        );

        process.on('exit', (code, signal) => {
            logOutput('exit')(`${code} (${signal})`)
            if (code === 0) {
                resolve(out);
            } else {
                reject(new Error(err.join('\n')))
            }
        });
    });
}

(async () => {
    try {
        const output = await run()
        logOutput('main')(output)
        process.exit(0)
    } catch (e) {
        console.error('Error during script execution ', e.stack);
        process.exit(1);
    }
})();

相关问题 更多 >