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

6

我想要利用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

我正在尝试使用subprocess在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相关的安全风险?


如果您是唯一控制 shell 输入的人,则不会存在安全风险,但如果用户输入到达那里,则会存在安全风险。 - Oded BD
1个回答

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接