无法从管道(通过Python脚本)以非交互方式编辑文件(在Linux VM中)

v1uwarro  于 12个月前  发布在  Linux
关注(0)|答案(2)|浏览(104)

我试图从管道更新存在于我的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

yrefmtwq

yrefmtwq1#

您的引用不正确。到目前为止,最简单的修复方法是通过避免shell=True来避免引用。另请参阅Actual meaning of shell=True in subprocess;但这仍然非常复杂,因为嵌套的多层(ssh调用sudo调用bash -c)。我没有任何方法来测试这一点,但可以尝试这样做:

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"'\''")
    process = subprocess.run([
        'gcloud', 'compute', 'ssh', f'testuser@{VM_NAME}',
        f'--project={project_name}', f'--zone={vm_zone}',
        '--tunnel-through-iap', '--quiet',
        "--command=sudo bash -c '{update_config_command}'"
        ],
    capture_output=True,
    # also add this to avoid having to explicitly decode()
    text=True)
    output = process.stdout

字符串
bash -c的参数需要是一个字符串,这通常需要引号。在你想要运行的命令中替换单引号是一个相当笨拙的解决方案,但在这种情况下,我想你只需要推进。
通过删除shell=True,我去掉了一个需要引用的层,所以这稍微简单一些。如果你想坚持shell=True,你必须想办法再一次引用每个引用结构。

4xrmg8kj

4xrmg8kj2#

您还可以尝试将命令行写入shell脚本(.sh),然后在Python代码中调用此脚本文件。
举例来说:

  • MyShellScript.sh www.example.com
  • MyPythonScript.py www.example.com

相关问题