Как мне проигнорировать 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
  1. Установите любой вариант Windows Bash (например, Cygwin, MSYS2 или GnuWin32);
  2. Создайте простой скрипт перенаправления оболочки:

    exec "@"
    
  3. Создайте запись в реестре:

    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>"
    

    (...и так далее.)

  4. 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
Другие вопросы по тегам