使用转换脚本转Nessus扫描XML至MulVal遇XSB运行时错误求助
解决XSB运行时错误:Nessus转MulVal输入遇到的问题
我来帮你拆解这两个错误的原因和可能的解决方向,毕竟刚接触XSB/Prolog遇到这类问题很正常:
1. 关于lists : member / 2重定义的权限错误
Error[XSB/Runtime/P]: [Permission (Operation) redefine on imported predicate: lists : member / 2] in compile/1
这个错误的核心是标准库谓词被重复定义了:lists:member/2是XSB标准库lists模块里的内置谓词,用来判断元素是否在列表中。你的转换脚本(或者MulVal关联的代码)里,要么自己定义了一个同名的member/2谓词,要么导入的某个自定义模块里也有这个谓词,导致和标准库的版本冲突——XSB不允许重新定义已经导入的谓词,所以抛出了权限错误。
解决建议:
- 检查你的转换脚本,看看有没有手写的
member(X, List)之类的谓词,如果有,把它改名成my_member(X, List)或者其他不冲突的名字 - 确认脚本里的模块导入语句,比如有没有重复导入
lists模块,或者某个自定义模块和标准库的谓词命名撞车了
2. 关于usermod : vulProperty / 3等过程不存在的错误
Error[XSB/Runtime/P]: [Existence (No procedure usermod : vulProperty / 3 exists)]
这类“no procedure usermod : ...”的错误,本质是XSB找不到指定模块里的目标谓词,常见原因有三个:
- 模块未正确加载:转换脚本依赖的
usermod模块没有被导入,或者导入路径不对,XSB找不到对应的Prolog文件(通常是.P或.pl后缀) - 谓词未定义:
usermod模块里根本没有写vulProperty/3这个谓词,要么是脚本调用错了,要么是MulVal的配套模块有缺失 - 参数个数错误:可能脚本里调用的是
vulProperty/3,但实际模块里定义的是vulProperty/2(参数少一个),导致匹配失败
解决建议:
- 先找一下
usermod对应的Prolog文件,打开看看里面有没有vulProperty/3以及其他报错的谓词,如果没有,可能是你漏了MulVal的某个核心模块文件 - 检查转换脚本里的模块导入语句,比如有没有
:- use_module(usermod).,如果有,确认usermod.pl(或同名文件)是否在XSB的搜索路径里——你可以在XSB命令行里用assertz(file_search_path(library, '/path/to/your/mulval/modules'))把模块所在目录添加到搜索路径 - 核对脚本里调用谓词的参数个数,比如
vulProperty(A,B,C)是不是对应模块里的定义
下一步排查提示
如果你不确定哪里出问题,可以把转换脚本的关键部分(比如开头的模块导入、调用vulProperty的代码段)贴出来,这样更容易精准定位问题。
内容的提问来源于stack exchange,提问作者qz_99
相关产品推荐
相关产品推荐

