.exe с использованием Par::Packer со скриптом, содержащим Net::SSH2, не работает
Я использую модуль Net::SSH2 в моем скрипте Perl и пытаюсь сделать исполняемый файл (.exe для Windows), используя Par::Packer. Сценарий должен подключиться к Linux-серверу из окна Windows, используя открытые ключи, и не хочет вводить пароль.
Столкнулся с ошибкой ниже при запуске.exe
Не удается загрузить 'C:\Users...\AppData\Local\Temp\par-73656172756d7567616d\cache-a6d57d5a234829aae84d08c4a78a09ad307ea8d3\a9057da2.xs.dll' для модуля Net::SSH2: load_file: указанный модуль не найден в C:/Strawberry/perl/lib/DynaLoader.pm строка 193. в C:/Strawberry/perl/vendor/lib/PAR/Heavy.pm строка 123.
Попытка обойти следующие методы, но ни один из них не сработал
- Пытался упаковать с портативной версии Strawberry Perl
- Пытался связать a9057da2.xs.dll при упаковке с использованием Par:: Packer
Есть ли обходной путь или исправление для упаковки сценария perl в.exe с Net:SSH2. Или есть альтернативы Net::SSH2 для ssh из windows в Linux, используя открытые ключи (не передавая пароли)?
2 ответа
Если вы получаете что-то вроде:
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
Вероятно, вы не упаковываете libssh2
а также openssl
DLL внутри исполняемого файла.
Par::Packer
не обнаруживает зависимости DLL автоматически, вам нужно четко указать, какие из них нужны вашей программе (простой способ определить, какие DLL нужны вашей программе, - это использовать Process Monitor, утилиту, позволяющую отслеживать активность процесса).
Другой вариант - использовать мой модуль Win32:: Packer для упаковки приложения, которое автоматически находит зависимости DLL.