python - 在 python 中转义 bash 命令的最佳方法是什么?

标签 python bash

我有一个函数将命令作为字符串接收,并使用 aws 二进制文件在 AWS 容器上运行它。

该命令在用户请求运行的命令之前和之后添加了一些额外的符号 - 我不会解释为什么。

def run_command_on_aws_container(command: str, aws_info):
    full_command = f"bash -c 'echo -n \"|\"; {command}; echo -n \"|\"'"

    subprocess.run(["aws", ..., "--command", full_command], ...)
    ...

command_to_run_on_aws_machine = 'python -c "for i in range(10): print(i)"'

run_command_on_aws_container(command_to_run_on_aws_machine, aws_info)

这有效,但前提是我的 command_to_run_on_aws_machine 不包含单引号。例如,如果我的 command_to_run_on_aws_machine 是这样的:

command_to_run_on_aws_machine = "python -c 'for i in range(10): print(i)'"

这是完全相同的命令,但使用单引号而不是双引号,整个过程崩溃了。或者至少它没有达到您的预期。

有没有办法让我的 run_command_on_aws_container 函数与两个字符串一起工作,这样只要 command arg 是正确的 bash 命令,它就会运行?理想情况下,不仅仅是盲目地将字符串中的所有单引号转换为双引号,而是在某种程度上,如果命令包含正确转义的引号,它仍然有效?

注意:作为 command arg 发送到 run_command_on_aws_container 的所有命令都被硬编码到程序中。在远程系统上执行任意命令不存在安全问题。这只是为了方便,因此在函数外部编写的代码无需担心如何正确使用字符串。

最佳答案

shlex.quote() 专门为此设计:

full_command = "bash -c " + shlex.quote(f'echo -n "|"; {command}; echo -n "|"')

关于python - 在 python 中转义 bash 命令的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74308630/

相关文章:

python - 使用 "np.where"条件将值分配给数据框列时出现值错误

bash - 在 bash 中比较负数

bash - 将目录中的最后一个数字加 1?

linux - 如何避免 iconv 错误来停止我的程序

bash - 将文件分成单独的文件,每个文件 10,000 行

OSX 上的 Java 文件限制低于 bash

python - 是否有必要使用 SWIG 在接口(interface)文件中提及包装的 .c 文件的所有函数?

python - Numpy 字符串编码

python - 如果用户选择它,则在 Python 中运行一个函数 (EasyGui)

python - Flask WTF – 表单总是重定向到 root