诡异的encountered unrecognized patch id:FMJJ,看不见的因果

文章记录了解决WebLogic服务器在安装补丁时遇到的“encountered unrecognized patch id”错误的过程。通过升级BSU工具版本并解决JDK版本不兼容问题,成功安装了所需的补丁。

单位的几台外网weblogic应用服务器,由于未修复WSAT组件RCE漏洞,导致受到攻击.

找了oracle原厂过来升级weblogic,一些不重要的系统便留给了我练练手。

结果第一台服务器就遇到问题了,weblogic版本是10.3.3,需要先升到10.3.6,一切正常,

然后打patch补丁:

./bsu.sh -install -patch_download_dir=/home/weblogic/bea/utils/bsu/cache_dir -prod_dir=/home/weblogic/bea/wlserver_10.3 -patchlist=FMJJ -verbose 

结果报出如下错误:

encountered unrecognized patch id:FMJJ

简单粗暴的告诉我找不到补丁FMJJ。

但是我确确实实将补丁包解压在了cache_dir目录下面,没办法,删了,重新解压,还是报错。

又重新手打了一遍命令,还是报错,仔细检查了目录信息,还是报错。

重新上传patch补丁包,解压放到cache_dir,还是报错。

后来怀疑是java问题,于是使用了系统上存在的各种java,还是报错。

于是,满脑子都是:报错!报错!报错。。。

-------------------------------------------------------------------------------------------------------------------------------------------------

分割线是一条无情的时间轴,代表着失去的东西再也拿不回来,但昨日的报错依旧在今天一一闪现,折磨着我。

很多故事都会有个无意间的细节让人回味无穷,很多的问题也总是在无意的发现后重见光明,

像我,就在无意间发现bsu的版本是3.2.0,而其他升级补丁正常的版本都是3.3.0

于是下载了3.3.0版本的bsu,安装的时候报错告诉我,当前的jdk版本是1.6.0,而bsu 3.3.0版本需要jdk1.6.05以上的

看看,所有的问题就变得简单了。

找了个高版本的jdk,升级了bsu,再打补丁,一切正常。

----------------------------------------------------------------------------------------------------------------------------------------------------

复盘一下:

在做10.3.3升级到10.3.6的过程中,理论上是要将bsu也顺便升级到3.3.0的,但是由于当前java版本是1.6.0,导致了bsu升级失败,但并不

影响版本的升级,顺利升级到10.3.6,但它也没有抛出bsu升级失败的信息。

于是后面我在用老的版本bsu升级10.3.6上面的patch的时候,bsu它就一直报错:encountered unrecognized patch id:FMJJ

这样一看,其实也不怪bsu,毕竟它级别低,确实认不得FMJJ这个高级货啊。

那么,矛头就指向10.3.3到10.3.6的升级过程了,你倒是给我抛个错,给个警告也行啊。。。

-------------------------------------------------------------------------------------------------------------------------------------------------------

世间事,没那么多的无缘无故,因果二字,只不过是藏得太深罢了!

你遇到的这些错误: ``` lexer.l:8: unrecognized %option: / lexer.l:9: unrecognized %option: / lexer.l:10: unrecognized %option: / lexer.l:13: unrecognized rule ... ``` 说明 **Flex 无法识别你的 `%option` 指令和词法规则**,根本原因是:**你在 Flex 文件中使用了错误的注释语法!** --- ## ❌ 错误原因 你在 `lexer.l` 中写了: ```c %option bison-bridge // 启用与 Bison 的 YYSTYPE 兼容模式 %option noyywrap // 避免链接时报 yywrap 未定义 %option yylineno // 支持行号追踪 ``` 但 **Flex 不支持 C++ 风格的 `//` 注释!** 👉 Flex 在扫描 `.l` 文件时,会把 `//` 当成两个斜杠字符,而不是注释。 于是它试图将 `" 启用与 Bison..."` 解析为规则或选项,导致: - `unrecognized %option: /` → 把 `/` 当成了非法字符 - `unrecognized rule` → 把后面的字符串当成了无效的正则表达式 --- ## ✅ 正确做法:使用 C 风格注释 `/* ... */` ### ✅ 修正后的 `lexer.l`(关键修复) ```c %{ #include <stdio.h> #include <string.h> #include "parser.tab.h" /* 必须包含 Bison 生成的头文件 */ %} /* ============== 关键选项 ============== */ %option bison-bridge /* 启用与 Bison 的 YYSTYPE 兼容模式 */ %option noyywrap /* 避免链接时报 yywrap 未定义 */ %option yylineno /* 支持行号追踪 */ %% /* ============== 词法规则 ============== */ [ \t\n] ; /* 忽略空白字符 */ int { return INT_TYPE; } float { return FLOAT_TYPE; } void { return VOID; } main { return MAIN; } if { return IF; } else { return ELSE; } while { return WHILE; } for { return FOR; } "+" { return PLUS; } "-" { return MINUS; } "*" { return TIMES; } "=" { return ASSIGN; } ";" { return SEMI; } "," { return COMMA; } "(" { return LPAREN; } ")" { return RPAREN; } "{" { return LBRACE; } "}" { return RBRACE; } "<" { return LT; } ">" { return GT; } "<=" { return LE; } ">=" { return GE; } "==" { return EQ; } "!=" { return NE; } "||" { return OR; } "&&" { return AND; } "!" { return NOT; } [a-zA-Z_][a-zA-Z0-9_]* { strcpy(yylval.str, yytext); /* 使用 str 字段保存标识符名 */ return ID; } [0-9]+ { yylval.num = atoi(yytext); /* 将数字转为整数并赋值给 num 字段 */ return DIGIT; } . { printf("⚠️ 未知字符: %s\n", yytext); } %% /* 不需要写 yywrap(),因为 %option noyywrap */ ``` --- ## 🔧 重点说明 | 内容 | 正确写法 | |------|----------| | 注释 | 只能用 `/* ... */`,不能用 `//` | | `%option` 位置 | 必须在第一段(`%{...%}` 之后,`%%` 之前) | | 头文件包含 | `#include "parser.tab.h"` 必须存在且路径正确 | | 编译顺序 | 先运行 `bison -d parser.y` 生成 `parser.tab.h` | --- ## 🛠️ 完整编译流程(再次强调) ```bash # 1. 先用 Bison 生成 .tab.c 和 .tab.h bison -d parser.y -o parser.tab.c # 2. 再用 Flex 生成 lex.yy.c(此时 parser.tab.h 已存在) flex lexer.l -o lex.yy.c # 3. 最后编译链接 gcc lex.yy.c parser.tab.c -o tpl_parser ``` --- ## ✅ 测试运行 创建测试文件: ```bash cat > test.tpl << 'EOF' int main() { int a; a = 1; while (a < 10) { a = a + 1; } } EOF ``` 运行程序: ```bash ./tpl_parser test.tpl ``` 输出应为: ``` 开始语法分析... ✅ 语法分析成功!生成语法分析树: Program → int main() { VarDecl: Declare int a; Assign: a = 1; while (a < 10) { Assign: a = (a + 1); }; } ``` --- ## ✅ 总结:Flex 文件书写规范 | 规则 | 要求 | |------|------| | 注释 | 必须使用 `/* ... */`,禁止使用 `//` | | `%option` | 写在 `%{...%}` 之后、`%%` 之前 | | 包含头文件 | `#include "parser.tab.h"` 必须放在 `%{...%}` 中 | | 编译顺序 | 先 `bison` 后 `flex` | | 调试技巧 | 可加 `--debug` 参数查看 flex 扫描过程 | --- ##
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值