Python:raw_input在输入缓冲区留下了什么?

时间:2014-11-23 15:01:18

标签: python shell

我有一个使用raw_input读取的python脚本,然后使用system("sh")打开一个shell,例如

r_input = raw_input('Enter the key\n')
system("sh")

我需要为这个脚本提供一些二进制数据,我使用print或sys.stdout.write,例如。

python -c "import sys; sys.stdout.write('\x02\x03\x04')" | python ./input_parse.py 

问题在于,尽管输入是完全读取的,但是shell会立即退出,就好像它从stdin中获得了一些遗留物。当我从键盘输入脚本时,它可以工作,但是我不能把二进制数据放在那里,它被解释为字符串......

我试过subprocess,就像这样(但差别不大):

 python -c "import subprocess; process = subprocess.Popen(['python', 'input_parse.py], shell=False, stdin=subprocess.PIPE);process.stdin.write('hi')" | python ./py_deobf_input_parse.py

我怎样才能让它发挥作用?

更新:我找到了一个解决方案,可能并不理想,但有效。基本上我使用相同的subprocess模型,但必须将\n添加到输入的末尾。然后我做了另一个process.stdin.write将命令传递给打开的shell。我不得不在它们之间加入睡眠,否则它会立即退出。如果有人找到更好的答案,我仍然会给予肯定。

python -c "import subprocess; import time; process = subprocess.Popen(['./py_input_parse'], stdin=subprocess.PIPE); process.stdin.write('\x02\x02\x02\x02\n'); process.stdin.flush(); time.sleep(2); process.stdin.write('cat ./flag.txt \n');

1 个答案:

答案 0 :(得分:1)

你期待什么?你input_parse.py的标准输出是写作脚本的标准输出。一旦读完所有二进制数据,stdin就会完成。因此,之后调用shell会检测到已关闭的stdin并终止。