使用 Python 子进程运行 Charles Headless - 传入命令

Dan*_*own 6 python subprocess charles-proxy

我正在尝试利用 Charles Proxy 的 Web 界面功能,该功能允许您在无头模式下运行 Charles 并使用 curl 命令控制 Charles 到http://control.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
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用子进程在 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")
Run Code Online (Sandbox Code Playgroud)

“Charles -headless &”中的“&”在这里相关吗?据我了解,“&”允许 Charles 在 shell 中在后台运行。最初打开子进程时是否需要设置 shell=True ?

如果是这样,我如何避免与 shell=True 相关的安全风险?

小智 0

不会Charles -headless返回(因此您在原始 shell 命令中运行它&),因此您需要&在 Python 代码片段的后台运行它。

由于您的子进程已经启动了 shell(命令/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()
Run Code Online (Sandbox Code Playgroud)