perl - 使用 Par::Packer 和包含 Net::SSH2 的脚本打包的 .exe 无法正常工作

标签 perl strawberry-perl net-ssh pp-perl-par-packager perlnetssh

我在 Perl 脚本中使用 Net::SSH2 模块,并尝试使用 Par::Packer 制作可执行文件(对于 Windows 为 .exe)。该脚本需要使用公钥从 Windows 机器 ssh 到 Linux 机器,并且不需要输入密码。

运行 .exe 时遇到以下错误

Can't load 'C:\Users...\AppData\Local\Temp\par-73656172756d7567616d\cache-a6d57d5a234829aae84d08c4a78a09ad307ea8d3\a9057da2.xs.dll' for module Net::SSH2: load_file:The specified module could not be found at C:/Strawberry/perl/lib/DynaLoader.pm line 193. at C:/Strawberry/perl/vendor/lib/PAR/Heavy.pm line 123.

尝试使用以下方法解决问题,但均无效

  1. 尝试从 Strawberry Perl 的便携版本打包
  2. 尝试在使用 Par::Packer 打包时链接 a9057da2.xs.dll

是否有任何解决方法或修复程序可以使用 Net:SSH2 将 perl 脚本打包到 .exe。 或者是否有使用公钥(不传递密码)从 Windows 到 Linux 的 Net::SSH2 的替代方案?

最佳答案

如果你得到类似的信息:

Can't load D:\TEMP\par-76696b616d7768\cache-48ca417d0c47dd7f7245a1218d8d6614470afa93\7c34139c.xs.dll' for module XML::LibXML: load_file:The specified module could not be found at <embedded>/DynaLoader.pm line 193.
at <embedded>/PAR/Heavy.pm line 140.
BEGIN failed--compilation aborted at D:\TEMP\par-76696b616d7768\cache-48ca417d0c47dd7f7245a1218d8d6614470afa93\inc\lib/XML/LibXML.pm line 156.
Compilation failed in require at script/test.pl line 3.
BEGIN failed--compilation aborted at script/test.pl line 3.

然后添加以下测试代码
(检查 Listdlls.exe 的路径并根据需要修复以下内容)

#This is the code causing the issue
use XML::LibXML;
my $x = XML::LibXML->new();

ListPerlDLLs();

sub ListPerlDLLs
{
  my @ret =  `C:\\"Program Files"\\Sysinternals\\Listdlls.exe  $$`; # $$ : current PID

  foreach my $line (@ret)
  {
    $line =~ s/\s$//;
    next if $line !~ /^0x\w+\s+\w+\s+(.+)/;
    my $dll = $1;
    next if $dll =~ /^c:\\windows\\/i;
    print "$dll\n";
  }
}

Listdlls.exe 来自 Microsoft - 请参阅 SysInternals\

首先,双击Listdlls.exe以接受免责声明
(首次启动时将请求批准)。

当您运行Perl脚本时,您将得到如下内容:

D:/strawberry-perl/perl/bin/perl.exe
D:/strawberry-perl/perl/bin/perl532.dll
D:/strawberry-perl/perl/bin/libgcc_s_seh-1.dll
D:/strawberry-perl/perl/bin/libwinpthread-1.dll
D:/strawberry-perl/perl/bin/libstdc++-6.dll
D:/strawberry-perl/perl/lib/auto/Encode/Encode.xs.dll
D:/strawberry-perl/perl/lib/auto/Fcntl/Fcntl.xs.dll
D:/strawberry-perl/perl/lib/auto/Storable/Storable.xs.dll
D:/strawberry-perl/perl/lib/auto/Data/Dumper/Dumper.xs.dll
D:/strawberry-perl/perl/lib/auto/IO/IO.xs.dll
D:/strawberry-perl/perl/vendor/lib/auto/XML/LibXML/LibXML.xs.dll
D:/strawberry-perl/c/bin/libxml2-2__.dll
D:/strawberry-perl/c/bin/libiconv-2__.dll
D:/strawberry-perl/c/bin/liblzma-5__.dll
D:/strawberry-perl/c/bin/zlib1__.dll
D:/strawberry-perl/perl/lib/auto/List/Util/Util.xs.dll

如果您构建 EXE 并运行它,您将得到类似以下内容的信息:

D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/test.exe
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/perl532.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/libgcc_s_seh-1.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/libwinpthread-1.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/libstdc++-6.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/5461bd7b.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/1ed3ae5b.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/89b9c18b.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/18f23f26.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/0e796a00.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/5d0ea4ea.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/d3d27bc6.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/d8bcc032.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/64916f0f.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/76c6a0cc.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/6b1ff21f.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/4eceebd6.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/ebaed210.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/831f407e.xs.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/7c34139c.xs.dll
D:/strawberry-perl/c/bin/libxml2-2__.dll
D:/strawberry-perl/c/bin/liblzma-5__.dll
D:/strawberry-perl/c/bin/zlib1__.dll
D:/strawberry-perl/c/bin/libiconv-2__.dll

最后四个是缺少的 DLL -
使用 --link 参数添加它们:

call pp test.pl -o test.exe --link D:/strawberry-perl/c/bin/libxml2-2__.dll --link D:/strawberry-perl/c/bin/liblzma-5__.dll --link D:/strawberry-perl/c/bin/zlib1__.dll --link D:/strawberry-perl/c/bin/libiconv-2__.dll

关于perl - 使用 Par::Packer 和包含 Net::SSH2 的脚本打包的 .exe 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50967501/

相关文章:

mysql - 如何使用 UNIX 命令行将 XML 转换为 MYSQL 插入?

ruby 网络 ssh : How to authenticate with pubkey using a gateway

perl - (Windows 10)尝试安装 PPM 和 CPAN 都失败的 Perl 模块?

windows - 无法安装 perl CPAN 模块 POSIX::strptime

ruby net-ssh 登录 shell

ruby - Net::SSH 连接失败

jQuery .get() 和 Perl 不能一起运行

perl - 按字典顺序排序

html - 在 Windows 中安装 OTRS 3.2

windows - 如何创建拖放式 Strawberry Perl 程序?