DD-WRT Shell скрипт Wifi IP и добавление имени

Привет всем, я использую DD-WRT v.3.0 на своем маршрутизаторе Linksys EA6500, и у меня работает следующий скрипт, чтобы дать мне доступ к MAC-адресу WiFi, который в данный момент подключен к маршрутизатору:

echo "#!/bin/ash" > /tmp/getmac.sh
echo 'echo { > /tmp/www/list.html' >>/tmp/getmac.sh
echo "for i in \$(arp | awk '{print toupper(\$4)}'); do echo \$i, >> /tmp/www/list.html; done" >>/tmp/getmac.sh
echo 'echo } >> /tmp/www/list.html' >>/tmp/getmac.sh
chmod +x /tmp/getmac.sh
/tmp/getmac.sh

Я могу посетить http://192.168.1.1/user/list.html и он покажет мне список MAC-адресов Wi-Fi, которые в данный момент подключены к маршрутизатору:

Пример:

{ 01:81:18:3d:49:5e, 04:10:87:8c:47:9a, }

Тем не менее, я хотел бы изменить это, чтобы включить IP-адрес, а также НАИМЕНОВАНИЕ УСТРОЙСТВА.

Я нашел это на веб-сайте DD-WRT, но при запуске команды и проверке каталога я ее нигде не вижу.

 # mkdir -p /tmp/www
 while [ 1 ];
  do
  wl assoclist | awk '{print tolower($2)}' > /tmp/assocLIST
  # echo "<meta http-equiv="refresh" content="10"><b>Hostnames and IP addresses of WLAN clients</b> (last update: $(date))<p>" > /tmp/www/wlan.html
  while read assocLINE
   do
     dumpleases | awk '/'"$assocLINE"'/ {print "Hostname: " $1, "MAC: " $2, "IP: " $3}'
   # echo "<br>";
        done < /tmp/assocLIST     # >> /tmp/www/wlan.html
  sleep 10;
done;

Я хотел бы, чтобы это выглядело так:

{
    "data": [{
        "IP": "192.168.1.55",
        "MAC": "01:81:18:3d:49:5e",
        "HOST": "DavidsAndroidPhone"
    }, {
        "IP": "192.168.1.79",
        "MAC": "04:10:87:8c:47:9a",
        "HOST": "BobsIphone"
    }]
}

Может ли кто-нибудь помочь мне изменить мой первый сценарий, который я опубликовал, чтобы включить IP и NAME?

ОБНОВИТЬ

Когда я выполняю команду arp в PuTTYtel, я получаю следующую информацию:

DD-WRT login: root
Password:
==========================================================

     ___  ___     _      _____  ______       ____  ___
    / _ \/ _ \___| | /| / / _ \/_  __/ _  __|_  / / _ \
   / // / // /___/ |/ |/ / , _/ / /   | |/ //_ <_/ // /
  /____/____/    |__/|__/_/|_| /_/    |___/____(_)___/

                       DD-WRT v3.0
                   http://www.dd-wrt.com

==========================================================


BusyBox v1.24.1 (2016-03-07 05:09:22 CET) built-in shell (ash)

root@DD-WRT:~# arp
android-17af243062d3eb6b (192.168.1.144) at 00:ae:fa:4a:3a:4c [ether]  on br0

Так что в настоящее время скрипт, который я запускаю (getmac.sh), смотрит на это и получает только это:

{ 00:ae:fa:4a:3a:4c, }

Учитывая это, как я могу изменить скрипт, чтобы получить больше информации, которую я ищу, в правильном макете JSON?

ОБНОВЛЕНИЕ 2

Хорошо, у меня есть этот код здесь:

arp | awk 'BEGIN { print "{" } { print "MAC:" $4 ", IP:" $2 ", HOST:" $1} END { print "}" }'

Который выводит следующее:

{
MAC:00:ae:fa:4a:3a:4c, IP:(192.168.1.144), HOST:android-17af243062d3eb6b
}

Теперь, учитывая это выше, как я могу удалить ( и ) из IP и отформатировать его в правильной форме JSON? Я пробовал awk -F'(', но это не похоже на работу.

2 ответа

Решение

Во-первых, ваш текущий сценарий содержит невероятное количество ошибок. Это может быть переработано, чтобы просто

arp | awk 'BEGIN { print "{" } { print toupper($4) } END { print "}" }'

Без доступа к выходу из dumpleases мы не можем сказать вам, как добавить разрешение IP-адреса, но arp -n во многих Linux возвращает IP-адрес в $1и вы получите разрешенный адрес (если есть) без -n, Но, глядя на сценарий с веб-сайта, все, что вам нужно, вероятно, действительно dumpleases, Сценарий с веб-сайта может быть изменен на

while true  # fix silly [ 1 ]
do
  wl assoclist | awk '{print tolower($2)}' > /tmp/assocLIST
  dumpleases | awk 'NR==FNR { a[$1]++; next }
      $2 in a { print s "{"; print "\"Hostname\": \"" $1 "\";
         gsub("()", "", $2); print "\"MAC\": "\""" $2 "\"";
         print "\"IP\": \"" $3 "\""; print "}"; s=",\n" }' /tmp/assocLIST -
done

и если вы не заботитесь о wl assoclist часть или бесконечный цикл, все, что вам нужно, это рефакторинг dumpleases вывод в JSON. Это часть после $2 in a в сценарии выше. (Я предположил, что MAC-адрес это то, что wl assoclist производит; без выходных сэмплов, я просто должен многое здесь угадать.)


Что касается генерации сценария на лету, это просто глупо. Что-нибудь, что (я предполагаю немного здесь снова) выглядит

ssh busybox "echo 'echo moo' >/tmp/script
    chmod +x /tmp/script
    /tmp/script"

может быть переписан без потери функциональности, как просто

ssh busybox 'echo moo'

(и что бы это ни стоило, если бы скрипт не был таким бесполезным, я бы определенно рекомендовал переписать его, чтобы вместо этого использовать документ здесь).

Если интересует версия в формате JSON:

для этого формата ard DD-WRT:

root@myrouter:~# arp
myhost1.mysite.com (192.168.2.12) at 08:0b:05:04:08:04 [ether]  on br0 
myhost2.mysite.com (192.168.2.21) at 18:1b:15:14:18:14 [ether]  on br0 ...

Следующая команда:

arp | awk 'BEGIN { print "[" } {gsub(/[\(\)]/,""); print "  {\"MAC\": \"" $4 "\",\n   \"IP\": \"" $2 "\",\n   \"Address\": \"" $1 "\",\n   \"Iface\": \"" $7 "\"},"} END { print "]" }'

Возвращает:

[
  {"MAC": "08:0b:05:04:08:04",
   "IP": "192.168.10.12",
   "Address": "myhost1.mysite.com",
   "Iface": "br0"},
  {"MAC": "18:1b:15:14:18:14",
   "IP": "192.168.10.21",
   "Address": "myhost2.mysite.com",
   "Iface": "br0"},
]
Другие вопросы по тегам