Terraform带stty要求的local-exec执行报错,AWS VPN证书创建问题
解决Terraform AWS VPN证书创建报错与stty兼容问题
一、报错./easyrsa: 333: set: Illegal option -o echo的原因及修复
这个错误的核心是脚本用到了Bash专属语法,却被非Bash的Shell(比如Dash)执行了:
set -o echo是Bash独有的命令选项,而很多Linux发行版(比如Ubuntu)默认把/bin/sh指向Dash,Dash并不支持这个参数。- 虽然你的Terraform
local-exec指定了用/bin/bash执行外层脚本,但如果1-create_certificates_for_vpn_setup.sh内部调用easyrsa时,用了/bin/sh(比如easyrsa自身的shebang是#!/bin/sh,或者脚本里用sh easyrsa调用),就会触发这个错误。
修复步骤:
- 检查
easyrsa脚本的开头shebang行,把它改成指向Bash:
如果原来写的是#!/bin/bash#!/bin/sh,替换成上面的内容即可。 - 或者,在外层脚本
1-create_certificates_for_vpn_setup.sh里,调用easyrsa时明确指定用Bash执行:bash ./easyrsa [你的命令参数]
二、在Terraformlocal-exec中运行带stty要求的脚本
Terraform的local-exec默认运行在非交互式无终端环境,而stty命令需要控制终端(TTY),直接运行会报错。这里有两种常用解决思路:
方案1:启用伪终端(PTY)
在local-exec配置里添加pty = true参数,Terraform会创建一个伪终端,模拟交互式环境,让stty命令正常工作:
resource "null_resource" "vpn_certificates_creation" { provisioner "local-exec" { command = "./1-create_certificates_for_vpn_setup.sh" interpreter = ["/bin/bash"] pty = true # 启用伪终端支持stty操作 } }
方案2:在脚本中兼容非交互式环境
如果不想启用PTY,可以在脚本里判断当前环境是否有终端,选择性执行stty命令:
# 检查是否处于交互式终端环境 if [ -t 0 ]; then # 仅在有终端时执行stty配置 stty [你的参数] else # 非交互式环境下跳过或提示 echo "Non-interactive mode, skipping stty configuration" fi
也可以直接把stty的错误输出重定向到/dev/null,避免报错:
stty [你的参数] 2>/dev/null
内容的提问来源于stack exchange,提问作者Zioalex
相关产品推荐
相关产品推荐

