代码之家  ›  专栏  ›  技术社区  ›  Gary

iMac上的Shell脚本不再适用于High Sierra

  •  1
  • Gary  · 技术社区  · 7 年前

    我最近将iMac 27(2011年年中)从约塞米蒂升级到High Sierra,我正在努力恢复以前使用的一些功能!

    首先简要说明一下,我在Raspberry pi3上使用一些Python脚本从weather underground获取本地天气数据。这些脚本还处理数据,然后在pi上创建并存储XML文件。我还在pi上运行一个查找调用的http服务器。

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

    这在优胜美地上运行得很好,但现在我已经升级了 部件不工作!

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

    说点什么Http9a。上海 这是第一个名为的脚本,它读取当前卷级别并将其存储在本地文件中(在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
    

    说点什么Http9。上海 设置卷级别后,此脚本根据pi发送的内容执行say部分。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
    

    说点什么Http9b。上海 最后调用最后一个脚本,该脚本从第一步中创建的文件中读取原始卷,然后将卷重置为该级别。

    #!/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命令来说太大了 )

    为了找出问题所在,我尝试了许多方法:

    • 我编辑了脚本saysomethinghttp9。sh来消除传递给它的参数的say,只需在行中输入say Hey there( 请注意,上面的代码是经过编辑的版本 )

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

      • ./说点什么Http9a。上海

      • ./说点什么Http9。上海

      • ./说点什么Http9b。上海

    从终端调用时,所有3个脚本都能正常工作,所以这不是问题所在。

    为了调试对iMac的调用,我简化了流程,从流程中删除了iPad、pi和ISY994i。相反,我一直在尝试使用浏览器从同一网络上的PC向iMac打电话。

    在PC上直接从浏览器运行脚本的结果就是该脚本 说点什么Http9a。上海 说点什么Http9b。上海 工作,但 说点什么Http9。上海 没有!

    以下是在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”,并首先在终端中运行脚本,发现用户名是正确的。然后我从另一台电脑上运行了相同的脚本,看到用户名是“\u www”!于是我编辑了httpd。conf(apache2)文件并更改了包括 用户Sarah 集团员工 . 然而,这并没有纠正问题!

    接下来,我阅读了如何“使用su成为那个用户并尝试脚本”。通过阅读,我不断找到使用sudo的建议,最后找到了编辑sudoers文件的建议。所以我用这个命令 sudo visudo . 然后我在下面的行中添加了

    Sarah全部=(全部)无密码:全部

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Gary    7 年前

    在阅读了Mark Setchell的评论后,我在脚本中添加了“/usr/bin/id”,并首先在终端中运行脚本,发现用户名是正确的。然后我从另一台电脑上运行了相同的脚本,看到用户名是“\u www”!于是我编辑了httpd。conf(apache2)文件并更改了包含用户Sarah和组工作人员的部分。然而,这并没有纠正问题!

    接下来,我阅读了如何“使用su成为那个用户并尝试脚本”。通过阅读,我不断找到使用sudo的建议,最后找到了编辑sudoers文件的建议。所以我用这个命令 sudo visudo . 然后我在下面的行中添加了

    Sarah全部=(全部)无密码:全部

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