Elastic Beanstalk postdeploy钩子执行报exec format错误如何解决
问题根因
- 第一优先级原因:脚本使用了Windows格式的CRLF换行符。Linux系统解析脚本首行的shebang解释器声明时,会把行尾的
\r识别为解释器路径的一部分,无法找到对应的bash程序,就会抛出exec format error。你直接在实例上运行正常,是因为手动复制粘贴到实例的过程中换行符被自动转成了Linux的LF格式,而你打包上传的源文件依旧是CRLF格式。 - 第二可能原因:shebang声明没有放在脚本的第一行,首行存在空白字符、注释或者空行,导致系统无法识别解释器。
- 额外语法问题:你的脚本中捕获命令输出的写法错误,即使解决格式问题也无法正常执行,直接赋值会把
sudo、cat等关键字当成普通字符串赋值给变量,而非执行命令的返回结果。
修复步骤
1. 转换脚本换行符为Linux LF格式
可任选以下一种方式操作:
- 用VS Code打开脚本文件,点击右下角状态栏的
CRLF标识,切换为LF后重新保存 - Git管理的项目可以在根目录添加
.gitattributes文件,添加规则*.sh text eol=lf,确保所有sh文件提交时自动使用LF换行 - 也可以在Linux环境下执行
dos2unix 00_get_certificate.sh完成格式转换 - 同时确认
#!/usr/bin/env bash是脚本的第一行,前面没有任何空行或字符
2. 修正脚本的命令输出捕获语法
修改后的脚本内容如下:
#!/usr/bin/env bash file1=$(sudo cat /opt/elasticbeanstalk/config/ebenvinfo/region) file2=$(/opt/elasticbeanstalk/bin/get-config container -k environment_name) file3=$file2.$file1.elasticbeanstalk.com echo $file3 sudo certbot -n -d $file3 --nginx --agree-tos --email al@gmail.com
3. 保留现有权限配置
你已配置的.ebextension执行权限规则是正确的,无需调整。
内容的提问来源于stack exchange,提问作者dalton5
相关产品推荐
相关产品推荐

