我有一个函数,它接收一个命令字符串,并使用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
参数是一个正确的bash命令,它就会运行?理想情况下,不仅将所有单引号盲目转换为双引号,而且在命令包含适当转义引号的情况下,它仍然可以正常工作?
注意:所有作为command
参数发送到run_command_on_aws_container
的命令都是硬编码到程序中的。在远程系统上执行任意命令的安全问题不存在。这仅仅是为了方便,以便在函数外部编写的代码无需担心如何正确使用字符串。
shlex.quote()
。 - Barmar|
字符的存在是否意味着 shell 管道吗?看起来似乎不是,但由于所有特殊转义字符都很难一眼看清。很高兴了解shlex.quote
:-) - JL Peyret