使用子进程调用和 shlex 转义 bash 命令中的引号
Escaping quotes in bash command using subprocess call and shlex
我正在使用 python 的 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))
File "/usr/lib/python2.6/shlex.py", line 279, in split
return list(lex)
File "/usr/lib/python2.6/shlex.py", line 269, in next
token = self.get_token()
File "/usr/lib/python2.6/shlex.py", line 96, in get_token
raw = self.read_token() File "/usr/lib/python2.6/shlex.py", line 172, in read_token
raise ValueError, "No closing quotation"
ValueError: No closing quotation
我该如何处理?
编辑:我想在 bash 命令中保留那些引号和空格。
您没有在当前代码中转义引号,因为 \"
仅等于 "
。您应该使用双转义符来转义反斜杠 (\
) 字符:
arg1 = arg1.replace('"', '\"').replace("'", "\'")
arg2 = arg2.replace('"', '\"').replace("'", "\'")
不处理引号、空格等,直接用列表:
my_command = ["command", "-option1", arg1, "-option2", arg2]
subprocess.call(my_command)
我正在使用 python 的 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))
File "/usr/lib/python2.6/shlex.py", line 279, in split return list(lex)
File "/usr/lib/python2.6/shlex.py", line 269, in next token = self.get_token()
File "/usr/lib/python2.6/shlex.py", line 96, in get_token raw = self.read_token() File "/usr/lib/python2.6/shlex.py", line 172, in read_token
raise ValueError, "No closing quotation"
ValueError: No closing quotation
我该如何处理?
编辑:我想在 bash 命令中保留那些引号和空格。
您没有在当前代码中转义引号,因为 \"
仅等于 "
。您应该使用双转义符来转义反斜杠 (\
) 字符:
arg1 = arg1.replace('"', '\"').replace("'", "\'")
arg2 = arg2.replace('"', '\"').replace("'", "\'")
不处理引号、空格等,直接用列表:
my_command = ["command", "-option1", arg1, "-option2", arg2]
subprocess.call(my_command)