我有一个函数将命令作为字符串接收,并使用 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/