Lightweight OpenWrt script to show all client devices no matter the connection type (Wired, Wireless, DHCP or Static).
This can be considered a programmatic and better way to LuCi's Status > Routing - IP Neighbors
IP Address MAC Address Vendor (MAC) Hostname Iface Method State
-----------------------------------------------------------------------------------------------------------------------------
10.10.123.1 e8:39:35:ed:d6:30 Hewlett Packard Hp Pi (eth4) DHCP STALE
10.10.123.4 28:70:4e:32:36:5e Ubiquiti Inc USW-Flex-Mini Pi (eth4) DHCP DELAY
10.10.2.100 00:13:1c:21:ca:84 LiteTouch, Inc. * Pa (eth1) DHCP STALE
10.10.2.4 b0:6e:bf:bb:5c:61 ASUSTek COMPUTER INC. PC Pa (eth1) DHCP REACHABLE
169.254.216.15 b0:6e:bf:bb:5c:61 ASUSTek COMPUTER INC. PC Pa (eth1) DHCP STALE
10.10.5.123 a6:0d:e5:cc:21:aa - iPad - (wlan2) DHCP STALE
192.168.0.1 9c:53:22:de:10:43 TP-Link Systems Inc - wan (eth0) Static/? REACHABLE
192.168.0.10 00:13:1b:4a:a0:a9 - - wan (eth0) Static/? STALE
192.168.0.238 - - - wan (eth0) Static/? FAILED
Note that Vendor might not be displayed properly due the the request limits on https://api.macvendors.com when run for first couple of times...
You need to have basic commands (ip, grep, awk, sed etc...) available. Also bash (if you do not have it already):
opkg update
opkg install bash
Switch to bash
cat << 'THE_END' > /bin/list-clients && chmod +x /bin/list-clients && sed -i -e 's/\t//g' -e '/^[[:space:]]*$/d' -e '/^# /d' /bin/list-clients && grep -qxF '/bin/list-clients' /etc/sysupgrade.conf || echo '/bin/list-clients' >> /etc/sysupgrade.conf
#!/bin/sh
LEASES="/tmp/dhcp.leases"
ETHS="/etc/ethers"
MAC_VENDORS="/etc/mac-vendors.db"
# Mac vendor cahce
MAC_CACHE=$(cat "$MAC_VENDORS" 2>/dev/null)
# Print header
printf "%-28s %-17s %-34s %-25s %-22s %-10s %-10s\n" "IP Addr" "MAC Addr" "Vendor (MAC)" "Hostname" "Iface / SSID (dev)" "Method" "State"
printf %155s | tr \ -
echo
elap=0
ip neigh | sort | while read -r l; do
ip=$(echo "$l" | awk '{print $1}')
ifc=$(echo "$l" | sed -n 's/.* dev \([^ ]*\).*/\1/p')
mac=$(echo "$l" | sed -n 's/.* lladdr \([^ ]*\).*/\1/p')
state=$(echo "$l" | awk '{print $NF}')
[ -z "$ip" ] && ip="-"
[ -z "$ifc" ] && ifc="-"
[ -z "$state" ] && state="-"
# Hostname & Method detection
host=$(awk -v mac="$mac" '$2 == mac {print $4}' "$LEASES" 2>/dev/null)
meth="Static/?"
if [ -n "$host" ]; then
meth="DHCP"
elif grep -qi "^[[:space:]]*$mac[[:space:]]" "$ETHS" 2>/dev/null; then
meth="Static"
[ -z "$host" ] && host=$(awk -v mac="$mac" 'BEGIN{IGNORECASE=1} $1==mac {print $2}' "$ETHS" 2>/dev/null)
fi
[ -z "$host" ] && host="-"
# Mac vend lookup with local cache
vend="-"
pref=$(echo "$mac" | tr '[:lower:]' '[:upper:]' | cut -d: -f1-3)
[ -n "$pref" ] && vend=$(echo "$MAC_CACHE" | grep -i "^$pref=" | head -n1 | cut -d= -f2-)
if [ -z "$vend" ] && [ "$pref" != "---" ] && [ "$elap" -lt 4 ]; then
t0=$(date +%s)
jsn=$(wget -qO- "https://api.maclookup.app/v2/macs/$mac" 2>/dev/null)
elap=$(($(date +%s) - t0))
resp=$(printf "%s" "$jsn" | sed -E 's/.*"company": *"([^"]*)".*/\1/')
[ -z "$resp" ] && [ "$(printf "%s" "$jsn" | sed -E 's/.*"isRand": *([^,}]*).*/\1/')" = "true" ] && resp="*RAND*"
if [ -n "$resp" ]; then
vend="$resp"
echo "$pref=$vend" >> "$MAC_VENDORS"
MAC_CACHE="${MAC_CACHE}${MAC_CACHE:+
}$pref=$vend"
fi
fi
[ -z "$mac" ] && mac="-"
[ -z "$vend" ] && vend="-"
owrtIfc=$(uci show network 2>/dev/null | grep "$ifc" | cut -d. -f2 | cut -d= -f1 | head -n1)
[ -z "$owrtIfc" ] && owrtIfc=$(iwinfo "$ifc" i 2>/dev/null | sed -n 's/.*ESS..: "\(.*\)".*/\1/p')
[ -z "$owrtIfc" ] && owrtIfc=$(iw dev "$ifc" info 2>/dev/null | awk -F 'ssid ' '/ssid/ {print $2}')
[ -z "$owrtIfc" ] && owrtIfc="-"
printf "%-28s %-17s %-34.34s %-25.25s %-22.22s %-10s %-10s\n" "$ip" "$mac" "$vend" "$host" "$owrtIfc ($ifc)" "$meth" "$state"
done
THE_END
Now you can simply run it as list-clients and add it as a Custom command (System > Custom commands) to LuCi!
Optionally you can add iw or iwinfo to if you want your wireless SSID to be resolved as fallback for Iface.
Note that command might not work properly if not run with root privileges.
Also, the list-clients itself does not require bash to run so after you are done with the install script, you can uninstall bash if you want...