Uniscan是一个用于扫描kali linux和其他笔测试发行版网站的工具。我曾经每周使用它来测试我的应用程序但是在我的linux工具进行一些更新之后,它现在在运行它时会出现以下错误:
xs / Moose.c:可加载库和perl二进制文件不匹配(获取握手密钥0xdb00080,需要0xdb80080)
我目前的perl版本是5.24.0
。我在某地读到如果我降级perl版本可以绕过这个问题,但我没有找到它应该降级到哪个版本,我也尝试了我的包管理器缓存中可用的所有版本,没有工作,它实际上改变了{ {1}}文件导致握手不匹配。我也尝试将Uniscan更新到最新版本(6.3.1),也没有。>
无论如何,有谁知道如何解决这个问题?提前谢谢。
答案 0 :(得分:4)
此错误消息来自perl解释器的Perl_xs_handshake
函数。来自评论:
实现添加到.c的各种XS _ * _ BOOTCHECK宏 ExtUtils :: ParseXS创建的文件,用于检查构建模块的perl with与运行的perl二进制兼容。
简而言之,这意味着Moose
perl模块是针对perl解释器的不兼容版本构建的(即降级perl
是一种可能的选项,但这有其自身的一组问题)。
Moose
是面向对象的perl扩展框架。很常见的是,一些发行版预先构建它并将其作为单独的包包括在发行版中(例如,在fedora下,有一个perl-Moose
fedora包。)
但是,Moose
也可用作CPAN
个包。
所以,如果你的发行版(kali)设置正确,事情应该照顾好自己(他们没有)。也就是说,如果kali升级perl
,他们应该重建各种perl模块包(Moose
就是其中之一)。
或者...... Moose
从未从发行版中安装,但是是从CPAN
安装的(例如,作为其他内容的一部分)。
另一种方法是调用cpan
并从那里下载,重建和安装Moose
包。
要查找的一件事是通过Moose
找到安装当前/usr/lib64/...
的位置(例如/usr/local/lib64/...
或perldoc -lm Moose
等)。这可能有助于配置cpan
以安装目录。
<强>更新强>
我无法找到如何使用cpan单独重建Moose,我试过&#34; cpan Moose&#34; (使用-c,-m,也尝试使用-g下载和安装,没有工作)所以我运行了一个cpan -u来更新所有已安装的模块。之后问题仍然存在。
有两种类型的软件包:发行版软件包(例如kali软件包)和CPAN
软件包。如果已从发行版安装了给定的perl模块,则cpan
不太可能尝试更新它。我们需要做的是让cpan
安装(来自CPAN
)。
当我使用cpan
时,我通常会/full_path_to/perl -MCPAN -e shell
。我使用完整路径的原因是我安装了多个不同的perl版本。有关为什么我有这些[和有来拥有它们]的背景,请参阅我的回答https://serverfault.com/questions/741186/cpan-is-using-old-perl-version-to-install-modules/741216#741216
之后,在提示符处,我通常会执行install Moose
之类的操作。它将寻找包依赖关系,我通常会对所有人说“是”。
cpan
允许一些不同的安装&#34;模式&#34;。值得注意的是,安装系统范围(即您是sudo
用户)或安装到$ HOME目录下的子目录。这允许非root用户安装CPAN模块,即使本地sysadmin不允许安装到/usr/lib64/...
查看$HOME/.cpan
特别感兴趣的是$HOME/.cpan/CPAN/MyConfig.pm
。在该文本文件中,查找与安装相关的信息:'make_install_make_command' => q[sudo /usr/bin/make]
。它可能有也可能没有sudo
。其中还有一些其他类似的选项(mbuild_install_build_command
)。如果他们没有sudo
,您可以手动编辑该文件。
我们稍后会回到这一点。但是,首先要做的是在uniscan
下运行strace
。无论如何配置,版本化等,这将记录正在发生的事情。这是一个脚本,其中包含我推荐用于strace
的选项:
strace -ttt -i -f -ff -etrace=all -o /anyplace/log/whatever.spysys \
-eread=0,1,2,3,4,5,6,7,8,9,10 -ewrite=0,1,2,3,4,5,6,7,8,9,10 \
-eread=11,12,13,14,15,16,17,18,19,20,21 \
-ewrite=11,12,13,14,15,16,17,18,19,20,21 \
-eread=22,23,24,25,26,27,28,29,30,31,32 \
-ewrite=22,23,24,25,26,27,28,29,30,31,32 \
-eread=33,34,35,36,37,38,39,40,41,42,43 \
-ewrite=33,34,35,36,37,38,39,40,41,42,43 \
-eread=44,45,46,47,48,49,50,51,52,53,54 \
-ewrite=44,45,46,47,48,49,50,51,52,53,54 \
-eread=55,56,57,58,59,60,61,62,63,64,65 \
-ewrite=55,56,57,58,59,60,61,62,63,64,65 \
-eread=66,67,68,69,70,71,72,73,74,75,76 \
-ewrite=66,67,68,69,70,71,72,73,74,75,76 \
-eread=77,78,79,80,81,82,83,84,85,86,87 \
-ewrite=77,78,79,80,81,82,83,84,85,86,87 \
-eread=88,89,90,91,92,93,94,95,96,97,98 \
-ewrite=88,89,90,91,92,93,94,95,96,97,98 -eread=99 -ewrite=99 -x \
/usr/bin/whatever
将/anyplace/...
替换为适合您系统的内容。将/usr/bin/whatever
替换为失败的uniscan
命令。如果您通常以root身份运行uniscan
,则可以strace
加sudo
请注意,strace
的这些选项会生成输出的批次,但它们不会留下任何有价值的内容。最终,uniscan
命令将[正如您已经遇到的那样]中止,但是,现在,strace
输出将具有原因。
具体来说,通过筛选日志输出,您可以找到失败的Moose.so
的确切完整路径。也就是说,perl
将打开一个Moose相关文件(成功),然后很快将失败消息输出到stderr。驼鹿文件可能位于/usr/lib64/...
中,或者可能位于某些完全奇怪的位置,例如/usr/local/lib64/...
,或者甚至更奇怪,/usr/lib64/uniscan/lib/Moose/...
。但是,这现在告诉我们我们想要重建和安装moose的地方。
注意:正如您可能已经注意到的那样,我的原始答案已被编辑[迂腐]用于语法,但是,实质上取代了我使用find
的建议[我没有&#39; t赞成]。
无论如何,要匹配cpan
和strace
的内容。当您使用cpan
时,它可能已经在&#34;安装到$HOME/...
&#34;模式,其中,IIRC是默认值。因此,如果是这种情况(即检查MyConfig.pm
),您可能会在主目录下找到更新的包,而不是所需的系统范围目录。因此,为了帮助验证这一点,请执行find $HOME -name '*Moose*'
并查看出现的情况。
因此,根据strace
文件名,文件的时间戳应与您执行cpan
命令的时间相匹配。但是,我打赌他们不会赢。
在$HOME/.cpan
下,有一个子目录$HOME/.cpan/build
。这是cpan
命令下载和存储包文件的位置。它还在那里构建包。如果您对cpan
的调用涉及Moose,则应该有一些*Moose*
个文件和目录。
每当我有一个&#34;坏&#34;包,IIRC,我刚从$HOME/.cpan/build
(以及一些依赖包)中删除它,然后再次install
。事情得到重新下载,重建和重新安装。
从strace
我们现在知道使用了哪个perl解释器(可能是/usr/bin/perl
),它从中获取了moose文件。驼鹿文件应位于@INC
目录之一下。如果是的话,很好。如果没有,这意味着&#34;包装&#34; uniscan
的脚本正在为Moose建立一条非标准路径,这就是做这个问题的原因:确认与否。
然后,如果需要,请修复MyConfig.pm
。如果缺少sudo
,那可能就是您所需要的。然后,只需install Moose
。
如果您愿意,可以先删除$HOME/.cpan/build
。
答案 1 :(得分:2)
一个简单的cpan -r
为我解决了这个问题。运行花了几十分钟。
克雷格·埃斯蒂(Craig Estey)的accepted answer中已经暗示了这一点,但也许有些读者想试一试,并在等待完成时详细了解其方式和原因。