通配符在使用shlex的子进程调用中不起作用



语言:Python v2.6.2

OS: AIX 5.3

我正在使用Python将一些文件从备份恢复到测试系统-所有命令都以下面的方式调用,但是有些命令就是不想工作。

#!/usr/bin/python
import subprocess, shlex
cmd = 'sudo rm -rf /work/TEST/*'
arg = shlex.split(cmd)
# This does not work
p = subprocess.Popen(arg)
# This, however, works just fine
p = subprocess.Popen(cmd, shell=True)

如果我从命令中删除*,它们会正常工作(好吧,它们应该在没有通配符的情况下工作,不幸的是这不是我想要的)。

出于明显的安全原因,我真的不想使用shell=True,但是有几个其他命令基本上做同样的事情。如果命令中有一个通配符,它就不会工作-它执行没有错误,只是不做任何事情。

下面的命令(通过shlex解析):
sudo mv /work/testrestore/production/* /work/TESTC

生成以下内容:

mv: 0653-401 Cannot rename/work/teststore/production/* to/work/TESTC/*:路径名中的文件或目录不存在

这就好像unix现在试图移动一个名为*的文件,而不是使用*作为通配符。这是shlex的典型行为吗?

编辑:我试过用转义*,也试过从单引号改为双引号。

要用它的含义替换*,您要么需要shell,要么需要glob模块。所以最简单的方法是shell=True(如果命令是恒定的,我没有看到任何安全漏洞)。

另一种方法是

#!/usr/bin/python
import subprocess
import shlex
import glob
cmd = 'sudo rm -rf /work/TEST/*'
arg = shlex.split(cmd)
arg = arg[:-1] + glob.glob(arg[-1])
# This should work now
p = subprocess.Popen(arg)

或者,如果你想自己附加路径,

cmd = 'sudo rm -rf'
basearg = shlex.split(cmd)
arg = basearg + glob.glob(path+"/*")

相关内容

  • 没有找到相关文章

最新更新