Как мне игнорировать Perl shebang в Windows с Apache 2?
-
19-09-2019 - |
Вопрос
Я настроил локальную веб-среду Perl на своем компьютере с Windows.Приложение, над которым я работаю, изначально создано на сервере Linux, поэтому исходный код .pl
файлы выглядят так:
#!/usr/bin/perl
Это вызывает следующую ошибку на моей машине для разработчиков Windows:
(OS 2)The system cannot find the file specified.
Можно ли изменить мою конфигурацию Apache 2, чтобы шебанг игнорировался на моем компьютере с Windows?Конечно, я мог бы установить #!c:\perl\bin\perl.exe
, это очевидно;но проблема заключается в развертывании обновленных файлов.Очевидно, что было бы очень неудобно менять это значение при каждом развертывании.Я использую АктивПерл на Виндовс 7.
Обновлять:
Я должен был упомянуть, что мне нужно сохранить шебанг, чтобы сценарии работали на нашем рабочем сервере Linux с общим хостингом.Если бы у меня не было этого ограничения и мне не пришлось бы использовать шебанг, очевидным ответом было бы просто не использовать его.
Решение
я использую #!/usr/bin/perl
в моих сценариях и настройте Apache в Windows, чтобы он игнорировал строку shebang.Добавлять
ScriptInterpreterSource Registry-Strict
на ваш httpd.conf
и настройте ключ реестра Windows, как описано в Документы Apache.
Вот что я получаю, когда экспортирую ключ:
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command] @="c:\\opt\\perl\\bin\\perl.exe"
Я использовал эту настройку с Apache и ActiveState Perl на своем ноутбуке с Windows, а также с дистрибутивами Apache и Perl, поставляемыми с ArchLinux, на моем сервере.
Документы Apache (на которые я дал ссылку выше) гласят:
Опция Registry-Strict, новая в Apache 2.0, делает то же самое, что и Registry, но использует только подраздел.
Shell\ExecCGI\Command
. АExecCGI
ключ не общий.Его необходимо настроить вручную в реестре Windows и, следовательно, предотвратить случайные вызовы программ в вашей системе..(выделено мной)
Другие советы
Портативной лески Shebang не существует.Даже на той же платформе и архитектуре кто-то мог установить Perl в другом месте.
Хитрость в том, чтобы не устанавливать модули и скрипты вручную.Когда вы упаковываете все как дистрибутивы и используете инструментальную цепочку модулей, строки shebang автоматически изменяются, чтобы указывать на Perl, который вы использовали для установки всего.Вам не придется думать об этих деталях.:)
Я использую #! /usr/bin/env perl
как шебанг на всех моих Perl, будь то *nix или Windows.Windows просто игнорирует это, и Unixen следует за env к выбранному дистрибутиву Perl.
У меня это работало так: скопировать perl.exe в c:/usr/bin/ и переименовать его в perl (удалить .exe)
В Win7 и более поздних версиях это также можно сделать с помощью команды mklink «dos».
Запустите оболочку cmd от имени администратора и сделайте что-то вроде следующего:
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, но 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
, хотя я не понимаю, как им это удается.
- Установить любой вариант 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>"
(...и так далее.)
Запишите в своем
httpd.conf
файл:ScriptInterpreterSource Registry
Apache теперь будет разрешать ошибки Unix относительно интерпретации, заданной выбранным вами вариантом Bash.Это дает много большая гибкость, чем жесткое кодирование путей интерпретатора в реестре.