【问题标题】:Running a CGI script on Yosemite/Apache from another computer从另一台计算机在 Yosemite/Apache 上运行 CGI 脚本
【发布时间】:2017-04-29 00:09:42
【问题描述】:

我正在尝试从 Windows 10 计算机运行驻留在我的 iMac(安装了 Yosemite)上的简单 cgi 脚本。

这是 say_test01 脚本(请注意,我最后尝试使用 .cgi,但它也不起作用)

  #!/bin/bash

  echo -e "Content-type: text/html\n"

  cat << junk
  <html>
  <head>
  <title>
  saying
  </title>
  </head>
  <body>
  junk

  #-----------------------
  osascript -e "set volume 8"
  say -v Whisper This is just wrong!
  osascript -e "set volume 4"
  say -v Whisper This is OK!

  #-----------------------
  cat << junk
  </body>
  </html>
  junk

在 iMac 上,我运行的是 Apache v2.4.16。

在 iMac 上,我可以从终端输入 ./say_test01,我可以听到声音说出这句话。

同样,在 iMac 上,但是从浏览器中,当我输入 localhost/cgi-bin/say_test01 时,我看到的只是文件的内容。

通过阅读其他线程,我了解到这是因为系统不知道哪个应用程序与此文件相关联。

当我从 Win10 PC 上的浏览​​器运行命令 192.168.1.55/cgi-bin/saysomething 我看到显示的文件内容或收到错误消息“此站点可以'无法到达”。

所以我正在寻求一些帮助来解决这个问题......

httpd.conf 中有一些摘录:

这些行已删除“#”:

LoadModule authz_host_module libexec/apache2/mod_authz_host.so

LoadModule authz_core_module libexec/apache2/mod_authz_core.so

LoadModule cgi_module libexec/apache2/mod_cgi.so

LoadModule userdir_module libexec/apache2/mod_userdir.so

LoadModule alias_module libexec/apache2/mod_alias.so

这是目录部分:

<Directory "/Library/WebServer/CGI-Executables">
    AddHandler cgi-script .cgi
    Options FollowSymLinks +ExecCGI
    AllowOverride None
    Require all granted
</Directory>

最后删除了这一行的“#”

包括/private/etc/apache2/extra/httpd-userdir.conf

httpd-userdir.conf 文件中,以下行已删除 '#'

包括/private/etc/apache2/users/*.conf

/etc/apache2/users 目录中,我有一个文件 Name.conf,其中包含以下代码

<Directory "/Users/Name/Sites/">
    AllowOverride All
    Options Indexes MultiViews FollowSymLinks    
    Require all granted
</Directory>

我没有触及虚拟主机文件,因为我认为(?)它不适用于这里。

我的最终目标是从另一台计算机(树莓派)传递参数,可能使用 python 代码到 cgi 脚本,以便 iMac 可以“说出”我想要的...(例如今天的天气,灯刚刚打开。 ..等)

关于如何让这个工作的任何建议?

编辑:

使用查看错误日志的建议,我发现我的 httpd.conf 有错误。 Options FollowSymLinks +ExecCGI 行给了我一条错误消息,说我需要在所有选项前面加上“+”或没有选项!所以我将这一行改为Options +FollowSymLinks +ExecCGI。现在效果很好。

我现在从 ISY994i(Insteon 控制器)向 Raspberry pi3 发送一个 http GET 语句。在 pi 上,我设置了一个等待 GET 语句的 HTTPServer。收到后,它会在 pi 上触发一个 python 脚本,该脚本解析一个天气 xml 文件(我之前为我的 iRule 应用程序创建的,使用 wunderground.com 作为源)并提取当天的天气预报,这是一个文本描述性段落;然后它重新格式化文本预测,以便 iMac 可以正确地说出来;最后,使用 urllib2,它触发 iMac 来“说”天气。我仍然遇到一个问题,在 pi 上,将 HTTPServer 设置为在重新启动时自动运行,但是当我手动启动它时它运行良好。我将打开一个新问题以获得解决此问题的帮助。

【问题讨论】:

    标签: linux apache raspberry-pi cgi osx-yosemite


    【解决方案1】:

    首先要指出的是,通过网络服务器运行的脚本不太可能拥有让计算机说话之类的事情发生的权限。 Web 服务器用户将无权访问系统的该部分。您最好通过 ssh 执行此操作。

    但是,为了让您能够按照要求通过 Web 服务器运行脚本,如下所示:

    您需要在脚本中添加 .cgi 扩展名。您已经为 .cgi 扩展名设置了处理程序:

    AddHandler cgi-script .cgi
    

    所以它只适用于具有该扩展名的脚本。目前你没有。我知道你说你试过了,但没有它肯定行不通。所以把它放回去,看看它现在是否有效。如果没有,请不要再次取下它。这是需要的。让我知道你的进展情况。

    【讨论】:

    • 有趣的是,几年前我使用旧版本的操作系统和同一台 iMac 进行了这项工作。但是,硬盘驱动器死了,我丢失了大部分设置。我还将操作系统升级到优胜美地,它的处理方式似乎与我之前使用的操作系统不同。其中一项特别是 WebSharing。我还明白,如果脚本位于定义的目录中,我不需要 .cgi,即 /Library/WebServer/CGI-Executables 对我来说!
    • 您不需要 .cgi 扩展名,但这需要不同的配置。使用您拥有的配置,它是必需的。正如我已经解释的那样。您是否尝试将其重新添加?
    • 好的,我复制了say_test01文件并创建了say_test01,cgi。现在这两个文件都不能在 iMac 上的浏览​​器上运行!我什至没有看到文件的内容。浏览器似乎挂了!这是我看到的 ls -l -rwxr-xr-x 1 Sarah wheel 429 Dec 13 14:28 say_test01 -rwxr-xr-x 1 Sarah wheel 429 Dec 13 16:33 say_test01.cgi
    • 错误日志说明了什么?您在查看源代码中看到了什么?
    • 以下是最近的错误日志项:AH00558:httpd:无法可靠地确定服务器的完全限定域名,使用 Garys-iMac.local。全局设置“ServerName”指令以禁止显示此消息 [Tue Dec 13 17:21:08.274784 2016] [mpm_prefork:notice] [pid 3650] AH00163: Apache/2.4.16 (Unix) 已配置——恢复正常操作 [Tue Dec 13 13 17:21:08.275000 2016] [core:notice] [pid 3650] AH00094:命令行:'/usr/sbin/httpd -D FOREGROUND' [2016 年 12 月 13 日星期二 17:31:26.198376] [mpm_prefork:notice] [ pid 3650] AH00169: 捕获 SIGTERM,正在关闭
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2014-01-21
    • 2015-03-28
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多