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



我正在使用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))

文件 "/usr/lib/python2.6/shlex.py",第 279 行,拆分 返回列表(莱克斯)

文件 "/usr/lib/python2.6/shlex.py",第 269 行,在下一个 令牌 = self.get_token()

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

提高值错误,"无结束报价"

值错误:无结束报价

我该如何处理它?

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

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

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

您不会在当前代码中转义引号,因为"只是等于"。应使用双转义来转义反斜杠 ( ) 字符:

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

相关内容

  • 没有找到相关文章

最新更新