Shell iMac 上的脚本不再适用于 High Sierra
Shell Script on iMac no longer working with High Sierra
我最近将我的 iMac 27”(2011 年年中)从 Yosemite 升级到 High Sierra,我正在努力找回以前使用的一些功能!
简要说明一下……首先,我在 Raspberry pi3 上使用一些 Python 脚本从 weather underground 获取本地天气数据。这些脚本还处理数据,然后在 pi 上创建并存储一个 XML 文件。我还在 pi 上 运行 一个寻找调用的 http 服务器。
在 iPad 上,使用 iRule,我有一个名为“天气预报”的按钮。按下此按钮时,它会触发我的 ISY994i (Insteon) 控制器上的网络资源,该控制器依次调用 pi 上的 http 服务器并向其发送参数。当 pi 收到调用并验证参数时,它 运行 是另一个 Python 脚本(在 pi 上)获取先前创建的 XML 文件中的数据并将其放入适当的下一步的格式。最后,该脚本通过 Apache2 向 iMac 发送 GET 请求,以大声朗读天气预报。
这在 Yosemite 上工作得很好,但现在我升级了 说 部分不起作用!
我在 iMac 上有 3 个 shell 脚本,在这个过程中从 pi 调用...
saysomethinghttp9a.sh 这是第一个调用的脚本,它读取当前音量级别并将其存储在本地文件中(在 iMac 上);然后它将音量级别更改为可接受的音量(我使用 18);
!/bin/bash
echo -e "Content-type: text/html\n"
PHRASE=`echo "$QUERY_STRING" | sed -n 's/^.*phrase=\([^&]*\).*$//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
saysomethinghttp9.sh 设置音量级别后,此脚本根据从 pi 发送的内容执行“说”部分。 pi调用这个脚本,发送一个参数,就是我想说的话。此调用针对介绍、日期、时间、天气预报和关闭重复多次;和
#!/bin/bash
echo -e "Content-type: text/html\n"
PHRASE=`echo "$QUERY_STRING" | sed -n 's/^.*phrase=\([^&]*\).*$//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
(请注意,我完成了调整音量的步骤,因为来自 iTunes 的音乐音量对于“说”命令来说太大了)
为了找出问题所在,我尝试了很多方法:
我编辑了脚本 saysomethinghttp9.sh 以消除传递给它的参数的“说”,并简单地在行中说“嘿,那里”(请注意上面的代码是编辑后的版本)
然后我在 iMac 上打开了一个终端会话并从那里发出命令...
./saysomethinghttp9a.sh
./saysomethinghttp9.sh
./saysomethinghttp9b.sh
从终端调用时所有 3 个脚本都有效,所以这不是问题所在。
为了调试对 iMac 的调用,我通过从流程中删除 iPad、pi 和 ISY994i 来简化流程。相反,我一直在尝试使用浏览器从同一网络上的 PC 调用 iMac。
在 PC 上直接从浏览器中 运行 运行脚本的结果是脚本 saysomethinghttp9a.sh 和 saysomethinghttp9b.sh 有效,但 saysomethinghttp9.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
恕我直言,我的编程经验相对有限。我经常使用在网上找到的示例来拼凑事物。
我不知道如何解释上面提到的错误!我能找到的与 "The timeout specified has expired" 相关的唯一信息与处理大量数据的情况有关!就我而言,正在处理的数据非常少!
如果能得到一些帮助或指导,我将不胜感激。
编辑:
阅读 Mark Setchell 的评论后,我首先在终端中将“/usr/bin/id”和 运行 添加到我的脚本中,发现用户名是正确的。然后我 运行 来自另一台 PC 的相同脚本,看到用户名是 '_www'!因此,我随后编辑了 httpd.conf (apache2) 文件并更改了包含 User Sarah 和 Group staff 的部分。然而,这并没有解决问题!
接下来我阅读了如何 'use su to become that user and try the script'。通过阅读,我一直在寻找改用 sudo 的建议,并最终找到了编辑 sudoers 文件的建议。所以我使用命令 sudo visudo 完成了此操作。然后我在下面的行中添加了
莎拉 ALL=(ALL) NOPASSWD: ALL
然后我再次尝试从 PC 中 运行ning 脚本,但是这次脚本 运行 并且再次 saying!
阅读 Mark Setchell 的评论后,我首先在终端中将“/usr/bin/id”和 运行 添加到我的脚本中,发现用户名是正确的。然后我 运行 来自另一台 PC 的相同脚本,看到用户名是 '_www'!因此,我随后编辑了 httpd.conf (apache2) 文件并更改了包含用户 Sarah 和组人员的部分。然而,这并没有解决问题![=10=]
接下来我阅读了如何 'use su to become that user and try the script'。通过阅读,我一直在寻找改用 sudo 的建议,并最终找到了编辑 sudoers 文件的建议。所以我使用命令 sudo visudo 完成了此操作。然后我在下面的行中添加了
莎拉 ALL=(ALL) NOPASSWD: ALL
然后我再次尝试 运行 来自 PC 的脚本,但是这次脚本 运行 并且再次 说 !
我最近将我的 iMac 27”(2011 年年中)从 Yosemite 升级到 High Sierra,我正在努力找回以前使用的一些功能!
简要说明一下……首先,我在 Raspberry pi3 上使用一些 Python 脚本从 weather underground 获取本地天气数据。这些脚本还处理数据,然后在 pi 上创建并存储一个 XML 文件。我还在 pi 上 运行 一个寻找调用的 http 服务器。
在 iPad 上,使用 iRule,我有一个名为“天气预报”的按钮。按下此按钮时,它会触发我的 ISY994i (Insteon) 控制器上的网络资源,该控制器依次调用 pi 上的 http 服务器并向其发送参数。当 pi 收到调用并验证参数时,它 运行 是另一个 Python 脚本(在 pi 上)获取先前创建的 XML 文件中的数据并将其放入适当的下一步的格式。最后,该脚本通过 Apache2 向 iMac 发送 GET 请求,以大声朗读天气预报。
这在 Yosemite 上工作得很好,但现在我升级了 说 部分不起作用!
我在 iMac 上有 3 个 shell 脚本,在这个过程中从 pi 调用...
saysomethinghttp9a.sh 这是第一个调用的脚本,它读取当前音量级别并将其存储在本地文件中(在 iMac 上);然后它将音量级别更改为可接受的音量(我使用 18);
!/bin/bash
echo -e "Content-type: text/html\n"
PHRASE=`echo "$QUERY_STRING" | sed -n 's/^.*phrase=\([^&]*\).*$//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
saysomethinghttp9.sh 设置音量级别后,此脚本根据从 pi 发送的内容执行“说”部分。 pi调用这个脚本,发送一个参数,就是我想说的话。此调用针对介绍、日期、时间、天气预报和关闭重复多次;和
#!/bin/bash
echo -e "Content-type: text/html\n"
PHRASE=`echo "$QUERY_STRING" | sed -n 's/^.*phrase=\([^&]*\).*$//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
(请注意,我完成了调整音量的步骤,因为来自 iTunes 的音乐音量对于“说”命令来说太大了)
为了找出问题所在,我尝试了很多方法:
我编辑了脚本 saysomethinghttp9.sh 以消除传递给它的参数的“说”,并简单地在行中说“嘿,那里”(请注意上面的代码是编辑后的版本)
然后我在 iMac 上打开了一个终端会话并从那里发出命令...
./saysomethinghttp9a.sh
./saysomethinghttp9.sh
./saysomethinghttp9b.sh
从终端调用时所有 3 个脚本都有效,所以这不是问题所在。
为了调试对 iMac 的调用,我通过从流程中删除 iPad、pi 和 ISY994i 来简化流程。相反,我一直在尝试使用浏览器从同一网络上的 PC 调用 iMac。
在 PC 上直接从浏览器中 运行 运行脚本的结果是脚本 saysomethinghttp9a.sh 和 saysomethinghttp9b.sh 有效,但 saysomethinghttp9.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
恕我直言,我的编程经验相对有限。我经常使用在网上找到的示例来拼凑事物。
我不知道如何解释上面提到的错误!我能找到的与 "The timeout specified has expired" 相关的唯一信息与处理大量数据的情况有关!就我而言,正在处理的数据非常少!
如果能得到一些帮助或指导,我将不胜感激。
编辑:
阅读 Mark Setchell 的评论后,我首先在终端中将“/usr/bin/id”和 运行 添加到我的脚本中,发现用户名是正确的。然后我 运行 来自另一台 PC 的相同脚本,看到用户名是 '_www'!因此,我随后编辑了 httpd.conf (apache2) 文件并更改了包含 User Sarah 和 Group staff 的部分。然而,这并没有解决问题!
接下来我阅读了如何 'use su to become that user and try the script'。通过阅读,我一直在寻找改用 sudo 的建议,并最终找到了编辑 sudoers 文件的建议。所以我使用命令 sudo visudo 完成了此操作。然后我在下面的行中添加了
莎拉 ALL=(ALL) NOPASSWD: ALL
然后我再次尝试从 PC 中 运行ning 脚本,但是这次脚本 运行 并且再次 saying!
阅读 Mark Setchell 的评论后,我首先在终端中将“/usr/bin/id”和 运行 添加到我的脚本中,发现用户名是正确的。然后我 运行 来自另一台 PC 的相同脚本,看到用户名是 '_www'!因此,我随后编辑了 httpd.conf (apache2) 文件并更改了包含用户 Sarah 和组人员的部分。然而,这并没有解决问题![=10=]
接下来我阅读了如何 'use su to become that user and try the script'。通过阅读,我一直在寻找改用 sudo 的建议,并最终找到了编辑 sudoers 文件的建议。所以我使用命令 sudo visudo 完成了此操作。然后我在下面的行中添加了
莎拉 ALL=(ALL) NOPASSWD: ALL
然后我再次尝试 运行 来自 PC 的脚本,但是这次脚本 运行 并且再次 说 !