【问题标题】:How do I ignore the Perl shebang on Windows with Apache 2?如何使用 Apache 2 在 Windows 上忽略 Perl shebang?
【发布时间】:2019-07-10 12:29:56
【问题描述】:

我已经在我的 Windows 机器上设置了一个本地 Perl Web 环境。我正在处理的应用程序最初来自 Linux 服务器,因此源 .pl 文件的 shebang 如下所示:

#!/usr/bin/perl

这会在我的 Windows 开发机器上导致以下错误:

(OS 2)The system cannot find the file specified.

是否可以更改我的 Apache 2 配置,以便在我的 Windows 机器上忽略 shebang?当然我可以将shebang设置为#!c:\perl\bin\perl.exe,这很明显;但问题在于部署更新的文件。显然,在每次部署时将其改回是非常不方便的。我在 Windows 7 上使用 ActivePerl

更新:

我应该提到我需要保留 shebang,以便脚本可以在我们的共享托管 Linux 生产服务器上运行。如果我没有这个约束并且我不必使用 shebang,那么显而易见的答案就是不使用它。

【问题讨论】:

  • 您的很多问题都受到 XY 问题的困扰 (perlmonks.org/index.pl?node_id=542341)。你问你认为解决方案是什么,而不是问问题。在这种情况下,我认为您实际上并不需要跨平台的 shebang 线,您只需要使用 Apache 2 在 Windows 7 上适用于 ActivePerl 的线。
  • @brian 太棒了!谢谢你的提示。我一直都知道我这样做,这就是问题所在。我将尝试在未来的答案中询问问题,而不是已经决定解决方案。
  • 好吧,既然您已经改变了问题,那就容易多了:您不需要在脚本中添加 shebang 行。除非您希望系统确定要调用哪个解释器,否则不需要它在那里。在你的情况下这并不重要。
  • @brian 问题已更新。

标签: windows perl apache2 activeperl shebang


【解决方案1】:

我在我的脚本中使用 #!/usr/bin/perl 并在 Windows 上配置 Apache 以忽略 shebang 行。添加

 ScriptInterpreterSource Registry-Strict

到您的httpd.conf 并按照Apache docs 中的说明设置 Windows 注册表项。

这是我导出密钥时得到的结果:

Windows 注册表编辑器版本 5.00 [HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command] @="c:\\opt\\perl\\bin\\perl.exe"

我一直在我的 Windows 笔记本电脑上将此设置与 Apache 和 ActiveState Perl 一起使用,并在我的服务器上使用 ArchLinux 附带的 Apache 和 Perl 发行版。

Apache 文档(我在上面链接到)状态:

Apache 2.0 中新增的 Registry-Strict 选项与 Registry 的作用相同,但仅使用子键 Shell\ExecCGI\CommandExecCGI 键并不常见。它必须在 Windows 注册表中手动配置,从而防止系统上的意外程序调用。 (强调我的)

【讨论】:

  • 按照文档的建议,我在所有情况下都试过了:server config, virtual host, directory, .htaccess - 但这似乎不能解决错误,我可能做错了什么?
  • 是的,我已经重新启动了。我正在使用 ActivePerl,所以我不知道,我需要查找什么注册表项?我正在使用httpd.conf 中的指令,就在DocumentRoot 下方(默认配置行177)。
  • 谢谢,我添加了密钥 HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command 和 REG_SZ 值 C:\Perl\bin\perl.exe -wT,它可以工作了!
【解决方案2】:

没有便携式 shebang 线。即使在相同的平台和架构上,也可能有人将 perl 安装在不同的位置。

诀窍是不要手动安装模块和脚本。当您将所有内容打包为发行版并使用模块工具链时,shebang 行会自动修改为指向您用于安装所有内容的 perl。您不必考虑这些细节。 :)

【讨论】:

  • 我无法使用此解决方案,因为在没有 shebang 的情况下,.pl 文件无法在我们共享的 Linux 托管服务器上执行。不幸的是,我无法更改服务器配置;如果是这种情况,我会为 Perl 添加一个 Apache 处理程序。此外,网站上有许多使用 shebang 的现有 .pl 脚本 - 如果我对 Perl 更有信心,我可能会改变这一点,但可以这么说,我不想踩到任何人的脚趾。
  • 嗯,您不必在两个安装中使用相同的 shebang 线。正确的安装将为您解决这个问题。
【解决方案3】:

我在我的所有 perl 上都使用 #! /usr/bin/env perl 作为 shebang,无论是在 *nix 还是 Windows 上。 Windows 只是忽略它,而 Unixen 跟随 env 到所选的 perl disto。

【讨论】:

    【解决方案4】:

    我的工作方式是将 perl.exe 复制到 c:/usr/bin/ 并将其重命名为 perl(剥离 .exe)

    【讨论】:

      【解决方案5】:

      在 win7 及更高版本中,您也可以使用“dos”命令 mklink 执行此操作。

      以管理员身份启动 cmd shell 并执行以下操作:

      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
      

      【讨论】:

        【解决方案6】:
        1. 安装任何 Windows Bash 风格(例如 Cygwin、MSYS2 或 GnuWin32);
        2. 创建一个简单的重定向 shell 脚本:

          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. 在您的httpd.conf 文件中记下:

          ScriptInterpreterSource Registry
          

        Apache 现在将根据您选择的 Bash 风格给出的解释来解析 Unix shebangs。这比在注册表中硬编码解释器路径提供了更多更多的灵活性。

        【讨论】:

          【解决方案7】:

          我手边没有 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 中工作,虽然我不知道他们是如何管理的。

          【讨论】:

          • #! perl 在我们的 Linux 服务器上无法运行,但在我的本地 Windows 开发机器上运行良好。还是谢谢。
          【解决方案8】:

          在 Windows 10 的 localhost 上运行基于 Perl 的网站时如何使用 Linux shebang (#!/usr/bin/perl)?

          这对我有用:

          • 本地主机上的 XAMPP\{site-name} (C:\xampp\htdocs\{site-name})
          • 独立安装 Strawberry Perl (C:\Perl\perl\bin),因为 XAMPP 包中包含的 Perl 并不令人满意

          在默认配置中,您必须使用这个 shebang:

          #!C:\perl\perl\bin\perl.exe -IC:\xampp\htdocs\{site-name}
          

          是否可以将目录(在-I 切换后)永久包含到@INC?

          是的,您可以通过设置 PERLLIB 或 PERL5LIB 环境变量来实现。这在从命令行运行 perl 脚本时有效,但令人惊讶的是它被 XAMPP 中的 apache 服务器忽略了。然而,@INC 目录之一(C:/Perl/perl/site/lib)通常是空的,因此您可以对您的网站目录进行符号链接:

          mklink /D c:\perl\perl\site\lib C:\xampp\htdocs\{site-name}
          

          现在,你可以使用这个shebang了:

          #!C:\perl\perl\bin\perl.exe
          

          此外,您可以创建目录 c:\usr\bin

          md c:\usr\bin
          

          并从 C:\perl\perl\bin\ 复制 perl.exe

          copy C:\perl\perl\bin\perl.exe c:\usr\bin\perl.exe
          

          (由于某些原因,另一个 mklink 技巧在这里不起作用。)

          最后,您可以在 Windows 上使用 Unix 风格的 shebang:

          #!/usr/bin/perl
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-28
            • 2021-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多