*未在子流程中扩展。Popen(安全性方面)

时间:2018-08-08 09:28:55

标签: python shell subprocess code-injection

这可行,但是外壳注入会带来安全风险

p = subprocess.Popen(['mv ./*.pdf ./target.pdf'], shell=True)

这不起作用,因为*不会引起问题

p = subprocess.Popen(['mv', './*.pdf', './target.pdf'])

我正在查看目录。如何在不影响安全性的情况下将到达的pdf重命名为target.pdf?

2 个答案:

答案 0 :(得分:0)

这有效

import os
import shutil

source = os.listdir(os.curdir)
destination = "target.pdf"
for files in source:
    if files.endswith(".pdf"):
        shutil.move(files,destination)

答案 1 :(得分:0)

您可以使用glob模块中的glob命令来获取类似路径扩展的shell:

  

glob.glob(pathname, *, recursive=False)

     

返回与路径名匹配的可能为空的路径名列表,该路径名必须是包含路径说明的字符串。路径名可以是绝对的(例如/usr/src/Python-1.5/Makefile)或相对的(例如../../Tools/*/*.gif),并且可以包含shell样式的通配符。损坏的符号链接包含在结果中(如在外壳程序中一样)。

     

如果recursive为true,则模式**将匹配任何文件以及零个或多个目录和子目录。如果模式后面跟随os.sep,则仅目录和子目录匹配。

     

(摘自docs

在您的情况下,它可能看起来像这样:

import shutil
import glob

sources = glob.glob('*.pdf')
destination = "target.pdf"
for file in sources:
    shutil.move(file, destination)