我正在编写一个需要使用subprocess
模块调用外部命令的脚本。问题是我需要将用户提供的文件传递给命令,因此它看起来类似于:
p = subprocess.run("command arg1 arg2 {userfile}".format(userfile=f),
capture_output=True, text=True, shell=True)
我必须运行命令shell=True
才能使其工作,这就是为什么我将命令作为字符串而不是列表传递。
问题是有人可能会传递一个名为: 的文件somefile && rm -rf ~
,这是一个有效的文件名,原因很奇怪(至少在 windows 上。不知道 mac/linux),然后发生了不好的事情。
因此,我需要在将用户输入传递给 shell 之前对其进行转义。我想为此使用内置shlex.quote
函数,所以通过上面的示例,我得到:'somefile && rm -rf ~'
并且命令变为:command arg1 arg2 'somefile && rm -rf ~cmd'
它应该在 unix 系统上工作。问题是这种转义在带有命令提示符的 Windows 上不起作用,因此我的脚本在我的 Windows 机器上失败。
是否有内置或第三方函数/库可以为所有平台正确转义命令行参数,或者至少对于 Windows(因为shlex.quote
适用于 unix)?
我正在 Windows 上开发,所以我需要这个脚本才能在这个平台上工作,我不认为这样的东西"{userfile}"
就足够好了。
python 3的任何解决方案将不胜感激。