Как мне проигнорировать Perl Shebang в Windows с Apache 2?
Я установил локальную веб-среду Perl на моей машине с Windows. Приложение, над которым я работаю, изначально написано на сервере Linux, и поэтому источник .pl
файлы выглядят так:
#!/usr/bin/perl
Это вызывает следующую ошибку на моем компьютере с Windows:
(OS 2)The system cannot find the file specified.
Можно ли изменить мой Apache 2 conf так, чтобы shebang игнорировался на моей машине с Windows? Конечно, я мог бы установить шебанг #!c:\perl\bin\perl.exe
это очевидно; но проблема заключается в развертывании обновленных файлов. Ясно, что было бы очень неудобно менять это обратно при каждом развертывании. Я использую ActivePerl на Windows 7.
Обновить:
Я должен был упомянуть, что мне нужно сохранить шебанг, чтобы скрипты работали на нашем производственном сервере Linux с общим хостингом. Если бы у меня не было этого ограничения, и мне не нужно было использовать шебанг, очевидным ответом было бы просто не использовать его.
7 ответов
Я использую #!/usr/bin/perl
в моих скриптах и настройте Apache в Windows, чтобы игнорировать строку shebang. добавлять
ScriptInterpreterSource Registry-Strict
на ваш httpd.conf
и настройте ключ реестра Windows, как описано в документации Apache.
Вот что я получу при экспорте ключа:
Редактор реестра Windows, версия 5.00 [HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command] @="C:\\ неавтоматического \\ \\ Perl бен \\ perl.exe"
Я использовал эту установку с Apache и ActiveState Perl на моем ноутбуке с Windows и дистрибутивами Apache и Perl, которые поставляются с ArchLinux на моем сервере.
Документы Apache (с которыми я связан выше) заявляют:
Опция Registry-Strict, которая появилась в Apache 2.0, делает то же самое, что Registry, но использует только подключ
Shell\ExecCGI\Command
,ExecCGI
Ключ не является общим. Он должен быть настроен вручную в реестре Windows и, следовательно, предотвращает случайные вызовы программы в вашей системе. (акцент мой)
Нет портативной линии Шебанга. Даже на той же платформе и архитектуре кто-то мог установить perl в другом месте.
Хитрость заключается в том, чтобы не устанавливать модули и скрипты вручную. Когда вы упаковываете все как дистрибутивы и используете цепочку инструментов модуля, строки shebang автоматически изменяются, чтобы указывать на perl, который вы использовали для установки всего. Вам не нужно думать об этих деталях.:)
Я использую #! /usr/bin/env perl
как shebang на всех моих Perl, будь то * NIX или Windows. Windows просто игнорирует это, и Unixen следует env выбранному perl disto.
Я работал так, чтобы скопировать perl.exe в c:/usr/bin/ и переименовать в perl (убрать.exe)
В win7 и выше вы также можете сделать это с помощью команды "dos" mklink.
Запустите командную оболочку от имени администратора и сделайте что-то вроде следующего:
mklink /d c:\usr c:\Perl # Activestate perl in c:\Perl\bin\perl.exe
mklink /d c:\usr c:\xampp\perl # Xampp perl in c:\xampp\perl\bin\perl.exe
- Установите любой вариант Windows Bash (например, Cygwin, MSYS2 или GnuWin32);
Создайте простой скрипт перенаправления оболочки:
exec "@"
Создайте запись в реестре:
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI\Command] @="<path-to-sh> <path-to-script>" [HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command] @="<path-to-sh> <path-to-script>" [HKEY_CLASSES_ROOT\.py\Shell\ExecCGI\Command] @="<path-to-sh> <path-to-script>"
(...и так далее.)
Jot в вашем
httpd.conf
файл:ScriptInterpreterSource Registry
Apache теперь будет разрешать шебанги Unix в соответствии с интерпретацией, данной выбранной вами версией Bash. Это дает гораздо большую гибкость, чем жесткие пути интерпретатора в реестре.
У меня под рукой нет Windows, но perlcritic говорит:
my $desc = q{Found platform-specific perl shebang line};
my $expl = q{Perl source in parrot should use the platform-independent shebang line: #! perl};
Так что я думаю #! perl
должно сработать.
Редактировать: не работает на Linux; по-видимому, работает в parrot
Хотя я не понимаю, как им это удается.
Как использовать Linux shebang (#!/ Usr/bin/perl) при запуске веб-сайта на основе Perl с {site-name} на локальном хосте в Windows 10?
Это работает для меня:
- XAMPP на локальном хосте \{имя-сайта} (C:\xampp\htdocs\{имя-сайта})
- независимо установленный Strawberry Perl (C:\Perl\perl\bin), потому что Perl, включенный в пакет XAMPP, не является удовлетворительным
В конфигурации по умолчанию вы должны использовать этот shebang:
#!C:\perl\perl\bin\perl.exe -IC:\xampp\htdocs\{site-name}
Можно ли постоянно включать каталог (после переключателя -I) в @INC?
Да, вы можете сделать это, установив переменные среды PERLLIB или PERL5LIB. Это работает при запуске сценария perl из командной строки, но, что удивительно, игнорируется сервером apache в XAMPP. Однако один из каталогов @INC (C:/Perl/perl/site/lib) обычно пуст, поэтому вы можете создать символическую ссылку на каталог своего веб-сайта:
mklink /D c:\perl\perl\site\lib C:\xampp\htdocs\{site-name}
Теперь вы можете использовать этот шебанг:
#!C:\perl\perl\bin\perl.exe
Кроме того, вы можете создать каталог c: \ usr \ bin
md c:\usr\bin
и скопируйте perl.exe из C: \ perl \ perl \ bin \
copy C:\perl\perl\bin\perl.exe c:\usr\bin\perl.exe
(Другой трюк с mklink здесь по некоторым причинам не работает.)
Наконец, вы можете использовать shebang в стиле Unix в Windows:
#!/usr/bin/perl