使用子进程调用和shlex在bash命令中转义引号

时间:2016-03-03 03:31:48

标签: python bash escaping subprocess shlex

我正在使用python&#39的subprocess.call()执行bash命令。 我将用户输入作为我的命令的参数,如下所示。

my_command = 'command -option1 {0} -option2 {1}'.format(arg1, arg2)

这里arg1和arg2是用户输入,但问题是用户输入可以有引号和空格所以我想用双引号括起来这样的参数。

my_command = 'command -option1 "{0}" -option2 "{1}"'.format(arg1, arg2)

由于我无法控制用户输入,因此输入可以包含双引号或单引号。因此,我将使用以下转义序列替换输入。

arg1 = arg1.replace('"', '\"').replace("'", "\'")
arg2 = arg2.replace('"', '\"').replace("'", "\'")
my_command = 'command -option1 "{0}" -option2 "{1}"'.format(arg1, arg2)

一切看起来都不错,但是当我执行命令时,我得到以下错误。

subprocess.call(shlex.split(my_command))
  

文件" /usr/lib/python2.6/shlex.py" ;,第279行,分割       返回列表(lex)

     

文件" /usr/lib/python2.6/shlex.py",第269行,下一步       token = self.get_token()

     

文件" /usr/lib/python2.6/shlex.py",第96行,在get_token中       raw = self.read_token()File" /usr/lib/python2.6/shlex.py" ;,第172行,在read_token中

     

引发ValueError,"没有收盘报价"

     

ValueError:没有收盘报价

我该如何处理?

编辑:我想在bash命令中保留这些引号和空格。

2 个答案:

答案 0 :(得分:2)

不要处理引号,空格等。只需使用列表:

my_command = ["command", "-option1", arg1, "-option2", arg2]
subprocess.call(my_command)

答案 1 :(得分:0)

您没有在当前代码中转义引号,因为\"仅等于"。您应该使用双转义来转义反斜杠(\)字符:

arg1 = arg1.replace('"', '\\"').replace("'", "\\'")
arg2 = arg2.replace('"', '\\"').replace("'", "\\'")