You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform local-exec生成文件时文件名含'$'\r的解决办法咨询

解决WSL环境下Terraform生成文件/目录带'$'\r的问题

问题原因

你遇到的keypairs'$'\r这类命名问题,本质是Windows风格的CRLF换行符(\r\n)被WSL的bash误解析。VS Code默认在Windows环境下保存文件会使用CRLF,当Terraform把<<-EOT块内的命令传递给bash执行时,每行末尾的\r被当成了目录/文件名的一部分,导致出现多余的'$'\r后缀。

解决办法

1. 修正VS Code的换行符设置(根治方法)

  • 打开你的Terraform文件,点击VS Code右下角状态栏的CRLF标识,选择LF,将当前文件的换行符改为Linux风格;
  • 若要全局默认使用LF,打开设置(快捷键Ctrl+,),搜索files.eol,将值设置为\n,确保所有新创建的文件都使用Linux换行符。

2. 修改local-exec命令,手动过滤\r

如果暂时无法修改VS Code的换行设置,可以在命令中通过工具去除\r:

resource "tls_private_key" "create_key" {
   algorithm     = "RSA"
   rsa_bits      = 4096

   provisioner "local-exec" {
     interpreter = ["/bin/bash", "-c"]
     command   = <<-EOT
        # 用tr去除目录名里的\r
        mkdir $(echo keypairs | tr -d '\r')
        cd $(echo keypairs | tr -d '\r')
        # 输出密钥时过滤\r,同时用printf替代echo避免额外换行问题
        printf "%s" "${tls_private_key.create_key.private_key_pem}" > "${var.deployment_name}.pem"
        printf "%s" "${tls_private_key.create_key.public_key_openssh}" > "${var.deployment_name}.pem.pub"
    EOT
  }
}

3. 使用Terraform的replace函数处理密钥内容

直接在Terraform层面替换掉密钥内容中的\r:

resource "tls_private_key" "create_key" {
   algorithm     = "RSA"
   rsa_bits      = 4096

   provisioner "local-exec" {
     interpreter = ["/bin/bash", "-c"]
     command   = <<-EOT
        mkdir keypairs
        cd keypairs
        echo "${replace(tls_private_key.create_key.private_key_pem, "\r", "")}" > "${var.deployment_name}.pem"
        echo "${replace(tls_private_key.create_key.public_key_openssh, "\r", "")}" > "${var.deployment_name}.pem.pub"
    EOT
  }
}

内容的提问来源于stack exchange,提问作者Adam Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:33:28