python - 如何逃避 os.system() 调用?

标签 python shell escaping

使用 os.system() 时,通常需要转义作为参数传递给命令的文件名和其他参数。我怎样才能做到这一点?最好是可以在多个操作系统/shell 上工作的东西,尤其是 bash。

我目前正在执行以下操作,但我确信必须为此提供一个库函数,或者至少是一个更优雅/强大/高效的选项:

def sh_escape(s):
   return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")

os.system("cat %s | grep something | sort > %s" 
          % (sh_escape(in_filename), 
             sh_escape(out_filename)))

编辑:我已经接受了使用引号的简单答案,不知道为什么我没有想到这一点;我猜是因为我来自 Windows,其中 ' 和 "的行为略有不同。

关于安全性,我理解这种担忧,但在这种情况下,我对 os.system() 提供的快速简便的解决方案感兴趣,并且字符串的来源不是用户生成的,或者至少不是用户生成的由受信任的用户(我)输入。

最佳答案

shlex.quote()从 python 3 开始做你想做的事。

(使用 pipes.quote 同时支持 python 2 和 python 3, 但请注意 pipes 自 3.10 起已被弃用 并计划在 3.13 中移除)

关于python - 如何逃避 os.system() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35817/

相关文章:

python - 即使用户和密码正确,Postgresql/psycopg2 密码验证错误

linux - 检查用户是否属于 sudo 组的脚本

bash - 当一个函数在 bash shell 中调用另一个函数时的局部变量作用域

unix 命令行使用 . (点)与没有

c# - 在字符串中使用条件运算符?

python - 如何从 Flask 应用程序执行 Shell 脚本

python - 使用推导式拆分并展平字符串和 None 值的列表

python - 如何使用 Python 的加密模块加载 RSA 公钥

bash - 如何使用 sed 从 bash 中的字符串中删除转义字符?

python - 如何为生成的 C++ 转义字符串?