DD-wrtでBashスクリプトが失敗する

DD-wrtでBashスクリプトが失敗する

私のWRT1900ac linksysから起動すると、次のbashスクリプトが実行されます。

USER="admin"
PASS="passhere"
PROTOCOL="http"
ROUTER_IP="192.168.1.1"

# Port to connect to which will provide the JSON data.
PORT=9898

while [ 1 ]
do
    # Grab connected device MAC addresses through router status page.
    MACS=$(curl -s --user $USER:$PASS $PROTOCOL://$ROUTER_IP/Status_Wireless.live.asp)

    # clear temp JSON file
    echo > temp.log

    # Get hostname and IP (just in case there is no hostname).
    for MAC in $(echo $MACS | grep -oE "wl_mac::[a-z0-9]{2}:[a-z0-9]{2}:[a-z0-9]{2}:[a-z0-9]{2}:[a-z0-9]{2}:[a-z0-9]{2}" | cut -c 9-);
    do
        grep 0x /proc/net/arp | awk '{print $1 " " $4}' | while IFS= read -r line
        do
        IP=$(echo $line | cut -d' ' -f1)
        MACTEMP=$(echo $line | cut -d' ' -f2)
        HOST=$(arp -a | grep $IP | cut -d' ' -f1)

        # if no hostname exists, just use IP.
        if [ "$HOST" == "" ]
        then
            HOST=$IP
        fi

        if [ "$MAC" == "$MACTEMP" ]
        then
            JSON="{'hostname' : '$HOST', 'mac_address' : '$MAC'}"
            echo $JSON >> temp.log
        fi

        done
    done

    # Provide the JSON formatted output on $PORT of router.
    # This allows one connection before closing the port (connect, receive data, close).
    # Port will reopen every 5 minutes with new data as setup in a cron job.
    echo -e "HTTP/1.1 200 OK\n\n $(cat temp.log)" | nc -l -p$PORT >/dev/null

    # Wait for 10 seconds and do it all over.
    sleep 10

done

何らかの理由でルーターを再起動してアクセスしようとすると、http://192.168.1.1:9898Android携帯電話がWi-Fi経由でルーターに接続され、ルーターのステータスページにMACアドレスが表示されますが、空のページのみが表示されます。

しなければならないこのページには、現在ルータに接続されているすべての無線MACアドレスがJSON形式で表示されます。

答え1

あなたが投稿したコンテンツは次のとおりです。強く打つスクリプトは、指定されていない一部のシェルによって実行されるスクリプトです。シェルスクリプトは常に次から始める必要があります。シェルボーンワイヤー。 bashスクリプトは通常、システムのbashパスで始まるか、それに続く必要があります#!/usr/bin/env bash#!#!/bin/bash

スクリプトを詳しく見たことはありませんが、bash構成を使用しているため失敗する可能性がありますが、組み込みLinuxインストール(DD-wrtなど)には通常bashは含まれておらず、BusyBox ashのみが含まれています。 DD-wrtでスクリプトを実行するには、移植可能なsh構造を使用してください。あなたはそれを使用することができます中断注意(ほとんどのLinuxディストリビューションで利用可能)bash関連の設定を見つけます。

私が見つけたbash関連の構成の1つは==条件文の演算子です[ "$HOST" == "" ]。このコードを書く移植可能な方法は[ "$HOST" = "" ]orです[ -z "$HOST" ]。同様に[ "$MAC" = "$MACTEMP" ]

返品変数置換を省略する理由がわからない場合は、必ず二重引用符を使用してください。。データにシェル特殊文字が含まれていない場合、スクリプトは正常に動作しますが、運を期待しないでください"。以下を入力してください。

関連情報