Thursday, 20 January 2022

Why does the spawn child process print to stdout only after execution with Python?

I have created the following node.js code with the spawn child process that executes a bash code inside it:

const spawn = require('child_process').spawn

const shellcode = `
file=$(mktemp)
cat > $file <<- "EOF"
echo "Hello World"
sleep 2
echo "Hello World"
sleep 2
echo "Hello World"
sleep 2
echo "Hello World"
EOF

bash $file
`

const child = spawn('/bin/bash', [ '-c',  shellcode ])

child.stdout.on('data', (data) => {
    console.log(data.toString())
})

It works perfectly fine, it executes the bash inside the shellcode variable and it prints Hello World while the node.js code is running.

My problem starts with Python, I've created the following code:

const spawn = require('child_process').spawn

const shellcode = `
file=$(mktemp)
cat > $file <<- "EOF"
import os

print('Hello World')
os.system("sleep 2")
print('Hello World')
os.system("sleep 2")
print('Hello World')
os.system("sleep 2")
print('Hello World')
EOF

python3 $file
`

const child = spawn('/bin/bash', [ '-c',  shellcode ])

child.stdout.on('data', (data) => {
    console.log(data.toString())
})

However, this code doesn't execute as a spawn code. It waits for the process to finish to print the results to stdout. I've also tested the same logic with a node.js code inside the shellcode variable and it works fine just like bash. What am I getting wrong? I'm not sure if it's a Python issue or if it's a node.js issue. Why is the Python code not behaving as a spawn (it's waiting for the process to finish to print its output)?



from Why does the spawn child process print to stdout only after execution with Python?

No comments:

Post a Comment