iMac上的Shell脚本不再使用High Sierra

时间:2017-12-19 04:44:24

标签: python bash cgi

我最近将我的iMac 27“(2011年年中)从Yosemite升级到High Sierra,我正在努力找回我以前工作的一些功能!

简要说明......首先,我使用Raspberry pi3上的一些Python脚本从地下天气中获取当地的天气数据。这些脚本还按摩数据,然后在pi上创建和存储XML文件。我也在pi上运行一个寻找呼叫的http服务器。

在iPad上,使用iRule,我有一个名为“天气预报”的按钮。当按下此按钮时,它会触发我的ISY994i(Insteon)控制器上的网络资源,该控制器又会在pi上向http服务器发送一个参数。当pi接收到调用并验证参数时,它会运行另一个Python脚本(在pi上),该脚本获取先前创建的XML文件中的数据并将其放入适当的格式以用于下一步。最后,该脚本通过Apache2向iMac发送GET请求,以便大声读取天气预报。

这在优胜美地上运作得非常好但是现在我已经升级了部分无效!

我在iMac上有3个shell脚本,在这个过程中从pi调用...

saidomethinghttp9a.sh 这是第一个调用的脚本,它读取当前的音量并将其存储在本地文件中(在iMac上);然后它将音量改为可接受的音量(我使用18);

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

PHRASE=`echo "$QUERY_STRING" | sed -n 's/^.*phrase=\([^&]*\).*$/\1/p' | sed "s/+/ /g" | sed "s/%20/ /g"`

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

currVol=$(osascript -e "get volume settings")

echo "Current Volume Setting = $currVol"

var1=$( echo $currVol | cut -d":" -f1 )
var2=$( echo $currVol | cut -d":" -f2 )
origVol=$( echo $var2 | cut -d"," -f1 )
echo $origVol
parm="set volume output volume $origVol"
echo $parm

destfile="/Users/Sarah/Sound_Volume/Volume1.txt"
echo $parm > $destfile

osascript -e "set volume output volume 18"

cat << junk
</body>
</html>
junk

sayomethinghttp9.sh 设置音量级别后,此脚本会根据pi发送的内容执行“说”部分。 pi调用这个脚本并发送一个参数,这就是我想说的话。对于介绍,日期,时间,天气预报和结束,此呼叫重复多次;和

#!/bin/bash

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

PHRASE=`echo "$QUERY_STRING" | sed -n 's/^.*phrase=\([^&]*\).*$/\1/p' | sed "s/+/ /g" | sed "s/%20/ /g"`

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

say "Hey There"

cat << junk
</body>
</html>
junk

saysomethinghttp9b.sh 最后调用最后一个脚本,该脚本从第一步创建的文件中读取原始卷,然后将卷重置为该级别。

#!/bin/bash
echo -e "Content-type: text/html\n"

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

file="/Users/Sarah/Sound_Volume/Volume1.txt"
echo $file
read -d $'\x04' parm < "$file"
echo $parm

osascript -e "$parm"

cat << junk
</body>
</html>
junk

请注意,我会通过调整音量的步骤,因为音乐的音量,对于'说'命令来说,音量太大了)

在试图弄清楚什么是错的时候,我尝试了很多东西:

  • 我编辑了脚本sayomethinghttp9.sh以消除传递给它的参数'say'并简单地在行中说“嘿那里”(注意上面的代码是编辑后的版本< / EM>)

  • 然后我在iMac上打开了一个终端会话并从那里发出命令......

    • ./ saysomethinghttp9a.sh

    • ./ saysomethinghttp9.sh

    • ./ saysomethinghttp9b.sh

从终端调用所有3个脚本都有效,这不是问题。

为了调试对iMac的调用,我通过从进程中删除iPad,pi和ISY994i简化了这个过程。相反,我一直在尝试使用浏览器从同一网络上的PC拨打iMac。

直接从浏览器在PC上运行脚本的结果是脚本 sayomethinghttp9a.sh sayomethinghttp9b.sh 工作但是 sayomethinghttp9.sh 没有!

以下是从PC上的浏览器尝试来自iMac的访问和错误日​​志条目...

访问日志

10.0.1.195 - - [18/Dec/2017:21:33:30 -0500] "GET /cgi-bin/saysomethinghttp9a.sh HTTP/1.1" 200 197

10.0.1.195 - - [18/Dec/2017:21:34:04 -0500] "-" 408 -

10.0.1.195 - - [18/Dec/2017:21:33:44 -0500] "GET /cgi-bin/saysomethinghttp9.sh HTTP/1.1" 200 53

10.0.1.195 - - [18/Dec/2017:21:33:49 -0500] "GET /cgi-bin/saysomethinghttp9.sh HTTP/1.1" 200 53

10.0.1.195 - - [18/Dec/2017:21:35:05 -0500] "GET /cgi-bin/saysomethinghttp9b.sh HTTP/1.1" 200 135

错误记录

[Mon Dec 18 21:34:44.356130 2017] [cgi:warn] [pid 29997] [client 10.0.1.195:60109] AH01220: Timeout waiting for output from CGI script /Library/WebServer/CGI-Executables/saysomethinghttp9.sh

[Mon Dec 18 21:34:44.356519 2017] [core:error] [pid 29997] (70007)The timeout specified has expired: [client 10.0.1.195:60109] AH00574: ap_content_length_filter: apr_bucket_read() failed

[Mon Dec 18 21:34:49.949284 2017] [cgi:warn] [pid 29575] [client 10.0.1.195:60107] AH01220: Timeout waiting for output from CGI script /Library/WebServer/CGI-Executables/saysomethinghttp9.sh

[Mon Dec 18 21:34:49.949652 2017] [core:error] [pid 29575] (70007)The timeout specified has expired: [client 10.0.1.195:60107] AH00574: ap_content_length_filter: apr_bucket_read() failed

对于完全披露,我的编程经验相对有限。我经常使用我在网上找到的例子将事情拼凑在一起。

我不知道如何解释上面提到的错误!我能找到的唯一信息与&#34相关;指定的超时时间已过期&#34;与处理大量数据的情况有关!就我而言,处理的数据非常少!

我希望得到一些帮助或指导如何继续。

修改

在阅读Mark Setchell的评论后,我在我的脚本中添加了&#39; / usr / bin / id&#39;并在终端中首先运行脚本,并看到该用户名是正确的。然后我从另一台PC运行相同的脚本,看到用户名是&#39; _www&#39;!然后我编辑了httpd.conf(apache2)文件并更改了包括用户Sarah 组员工的部分。然而,这并没有纠正这个问题!

接下来我读到了如何使用su成为该用户并尝试脚本&#39;。通过读数,我不断寻找使用sudo的建议,最后找到了编辑sudoers文件的建议。所以我使用命令 sudo visudo 来做到这一点。然后我在下面的行中添加了

Sarah ALL =(ALL)NOPASSWD:ALL

然后我再次尝试从PC上运行脚本,但是这次脚本运行并再次

1 个答案:

答案 0 :(得分:2)

在阅读了Mark Setchell的评论后,我在我的脚本中添加了'/ usr / bin / id'并在终端中首先运行了脚本,并看到该用户名是正确的。然后我从另一台PC运行相同的脚本,看到用户名是'_www'!于是我编辑了httpd.conf(apache2)文件并更改了包含User Sarah和Group人员的部分。然而,这并没有解决问题!

接下来我读到了如何'使用su成为该用户并尝试脚本'。通过读数,我不断寻找使用sudo的建议,最后找到了编辑sudoers文件的建议。所以我使用 sudo visudo 命令执行此操作。然后我在下面的行中添加了

Sarah ALL =(ALL)NOPASSWD:ALL

然后我再次尝试从PC上运行脚本,但是这次脚本运行并再次