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 관련 구성 중 하나는 ==조건문의 연산자 입니다 [ "$HOST" == "" ]. 이 코드를 작성하는 이식 가능한 방법은 [ "$HOST" = "" ]or 입니다 [ -z "$HOST" ]. 마찬가지로 [ "$MAC" = "$MACTEMP" ].

반품변수 대체를 생략해야 하는 이유를 모르는 경우에는 항상 큰따옴표를 사용하십시오.. 데이터에 셸 특수 문자가 포함되어 있지 않으면 스크립트가 제대로 작동할 수 있지만 행운을 기대하지는 마세요 ". 다음을 입력하세요.

관련 정보