Bash 脚本在 DD-wrt ​​中失败

Bash 脚本在 DD-wrt ​​中失败

我的 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:9898它时,即使我的 Android 手机通过 wifi 连接到路由器并且路由器在状态页面上显示 MAC 地址,它也只会显示一个空白页面。

什么应该该页面上显示的是当前连接到路由器的所有无线 MAC 地址,并以 JSON 形式显示。

答案1

您发布的内容不是巴什script,这是一个将由某个未指定的 shell 执行的脚本。 shell 脚本应始终以舍邦线。 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" ]

总是在变量替换周围加上双引号,除非你知道为什么需要将它们省略。如果您的数据从不包含 shell 特殊字符,您的脚本可能会正常工作,但不要指望运气,只需键入这些".

相关内容