我试图从管道更新存在于我的Linux VM中的文件。每次我都会得到一个或另一个语法错误。我使用Python执行此操作。
def get_awk_command():
return """cd /test/tlu; awk '{sub(/SampleUrl=.*/, "SampleUrl=https://google.com/api")}1' config.properties > config.tmp && mv config.tmp config.properties -f"""
async def update_config(args, project_name):
update_config_command = get_awk_command().replace("'", r"'\''")
gcp_command = f'gcloud compute ssh testuser@{VM_NAME} --project={project_name} --zone={vm_zone} --tunnel-through-iap --quiet --command=\"sudo bash -c {update_config_command}\"'
process = subprocess.run(gcp_command, shell=True, capture_output=True)
output = process.stdout.decode('utf-8')
字符串
所有缩进都是正确的。我认为这是失败的,由于该命令的构造方式。请帮助解决这个问题。
我得到的错误是
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file
型
2条答案
按热度按时间yrefmtwq1#
您的引用不正确。到目前为止,最简单的修复方法是通过避免
shell=True
来避免引用。另请参阅Actual meaning ofshell=True
in subprocess;但这仍然非常复杂,因为嵌套的多层(ssh
调用sudo
调用bash -c
)。我没有任何方法来测试这一点,但可以尝试这样做:字符串
bash -c
的参数需要是一个字符串,这通常需要引号。在你想要运行的命令中替换单引号是一个相当笨拙的解决方案,但在这种情况下,我想你只需要推进。通过删除
shell=True
,我去掉了一个需要引用的层,所以这稍微简单一些。如果你想坚持shell=True
,你必须想办法再一次引用每个引用结构。4xrmg8kj2#
您还可以尝试将命令行写入shell脚本(
.sh
),然后在Python代码中调用此脚本文件。举例来说: