我正在尝试使用Charles Proxy的Web界面功能,该功能允许您在无头模式下运行Charles,并使用http://control.charles的curl命令控制Charles。
在终端中,当我运行以下命令时,得到了所需的输出:
Charles -headless &
curl -v -x <MY IP ADDRESS HERE> http://control.charles/session/start
curl -o session.chls <MY IP ADDRESS HERE> http://control.charles/session/download
我正在尝试使用子过程在Python中重现这些命令。最初,我尝试为上述每个命令打开3个不同的子进程,只是意识到它们都需要在同一会话中。
这是我的实现,但没有得到任何输出:
charles_init = subprocess.Popen(["/bin/bash"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
charles_init.stdin.write(b"Charles -headless")
charles_init.stdin.write(b"curl -v -x <MY IP ADDRESS HERE> http://control.charles/session/start")
charles_init.stdin.write(b"curl -o session.chls <MY IP ADDRESS HERE> http://control.charles/session/download")
“ Charles -headless&”中的“&”是否与此相关?据我了解,“&”允许Charles在Shell中在后台运行。最初打开子流程时是否需要设置shell = True?
如果是,如何避免与shell = True相关的安全风险?
Charles -headless
不返回(因此您在原始Shell命令中使用&
运行它,因此您将需要使用&
在Python代码段的后台运行它。
由于子进程已经在启动外壳程序(/bin/bash
命令,所以shell=True
选项无关。
但是,我认为最好的方法是将每个命令作为自己的子进程来运行。例如:
charles = subprocess.Popen(['Charles', '-headless']) # In background already!
subprocess.run(['curl', '-v', '-x', '<MY IP ADDRESS HERE>', 'http://control.charles/session/start'])
subprocess.run(['curl', '-o', 'session.chls', '<MY IP ADDRESS HERE>', 'http://control.charles/session/download'])
# When done...
charles.kill()
charles.wait()