O script bash falha no DD-wrt

1

Eu tenho o seguinte script bash em execução na inicialização em meus linksys WRT1900ac:

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

E, por algum motivo, quando eu reinicio o roteador e tento visitar http://192.168.1.1:9898 , ele mostra apenas uma página em branco, embora eu tenha meu celular android conectado via wifi ao roteador e o roteador mostre o endereço MAC no status página.

O que deve estar nessa página é todo o endereço MAC sem fio atualmente conectado ao roteador e exibido em formato JSON.

    
por StealthRT 19.11.2016 / 20:07

1 resposta

0

O que você postou não é um script bash , é um script que será executado por algum shell não especificado. Um script de shell deve sempre começar com uma linha shebang . Um script bash deve começar com #!/usr/bin/env bash ou #! seguido pelo caminho para bash em seu sistema, normalmente #!/bin/bash .

Eu não olhei seu script detalhadamente, mas as chances são de que ele esteja falhando porque você usa construções bash, mas instalações Linux embutidas como DD-wrt normalmente não incluem bash, somente cinza BusyBox. Para fazer seu script funcionar no DD-wrt, siga as construções sh portáteis. Você pode usar os checkbashisms (disponíveis na maioria das distribuições do Linux) para procurar construções específicas do bash.

Uma construção específica da bash que eu vi é o operador == em condicionais, por exemplo %código%. A maneira portátil de escrever isso é [ "$HOST" == "" ] ou [ "$HOST" = "" ] . Da mesma forma [ -z "$HOST" ] .

Também coloque sempre aspas duplas em torno de substituições de variáveis, a menos que você saiba por que precisa deixá-las de fora . Seu script pode funcionar se seus dados nunca contiverem caracteres especiais, mas não conte com sorte, apenas digite [ "$MAC" = "$MACTEMP" ] .

    
por 20.11.2016 / 01:04