iMac上的Shell脚本不再与High Sierra合作

问题描述 投票:1回答:1

我最近将我的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调用...

sayomethinghttp9a.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

sayomethinghttp9b.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

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

在试图弄清楚出了什么问题时,我尝试了很多东西:

  • 我编辑了脚本sayomethinghttp9.sh以消除传递给它的参数的“说”并简单地在行中说“嘿那里”(注意上面的代码是编辑版本)
  • 然后,我在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

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

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

我将不胜感激如何进行一些帮助或指导。

编辑:

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

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

Sarah ALL =(全部)NOPASSWD:全部

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

python bash cgi
1个回答
2
投票

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

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

Sarah ALL =(全部)NOPASSWD:全部

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

© www.soinside.com 2019 - 2024. All rights reserved.