【发布时间】:2021-12-30 23:21:29
【问题描述】:
我正在使用子进程来获取命令的输出,运行命令通常需要大约 2 1/2 分钟,但使用子进程运行时大约需要 35 分钟。
这是有问题的代码:
process = subprocess.Popen(["wpscan --url " + s + " –e u"], stdout=subprocess.PIPE, shell=True)
output = process.communicate()[0]
有没有办法让它跑得更快?我对使用 subprocess 还不是很熟悉,所以我可能需要解释一下。
【问题讨论】:
-
这是您不应该使用
Popen(..., shell=True)的 经典示例。使用默认的shell=False不仅更简单,而且安全! -
然而,你的 Python 代码根本不涉及你生成的进程所做的事情,所以你无法解决这个问题(除非,实际上我上面的建议导致你的 shell 没有用 @ 做一些意想不到的事情987654324@ 包含例如子字符串 ` & sleep 2000
, and&` 和;在 URL 中相当常见,所以我的猜测是,shell=True是你的敌人) -
谢谢!是的,我确保它只有常规字符,所以它肯定是 shell=True。我试试看!
-
关于@MarcusMüller 提出的问题,您可能希望使用
safe_s = urllib.parse.quote_plus(s)对您的URL 进行编码 -
那么它们将被 shell 解释。这就是使用 shell (
shell=True) 的全部意义所在。如果您只想将值http://www.cnn.com? &作为参数传递给可执行文件,您只需使用shell=False和Popen(["wpscan", "--url", s, "-e", "u"])
标签: python python-3.x subprocess