【问题标题】:DD-WRT Shell script Wifi IP and Name additionDD-WRT Shell 脚本 Wifi IP 和名称添加
【发布时间】:2018-01-08 01:23:01
【问题描述】:

大家好,我在我的 Linksys EA6500 路由器上运行 DD-WRT v.3.0,我正在运行以下脚本,以便让我访问当前连接到路由器的 WiFi MAC 地址:

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,它会显示当前连接到路由器的wifi MAC地址列表:

例子:

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

但是,我想对其进行修改,使其也包括 IP 地址设备名称

我在 DD-WRT 网站上找到了this,但是在运行命令并检查目录时,我在任何地方都看不到它。

 # 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"
    }]
}

谁能帮我修改我发布的第一个脚本以包含 IPNAME

更新

当我在 PuTTYtel 中执行命令 arp 时,我得到以下信息:

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'(' 但这似乎不起作用。

【问题讨论】:

  • 呃,你为什么每次都生成脚本?无论如何,如果您只是发布生成的脚本,您的问题会更容易回答。
  • 如果您取消注释这些行,来自站点的脚本将生成一个文件 /tmp/www/wlan.html
  • ... 虽然临时文件有点笨拙。如果没有来自 wl assoclistgetleases 的示例输出,则不清楚它在做什么。
  • @tripleee Running wl assoclist 没有输出...

标签: linux bash shell cron dd-wrt


【解决方案1】:

首先,您当前的脚本包含大量杂乱无章的内容。它可以被重构为只是

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

如果无法访问来自dumpleases 的输出,我们无法真正告诉您如何添加 IP 地址解析,但许多 Linux 上的arp -n 返回$1 中的 IP 地址,您将获得解析后的地址 (如果有)没有-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'

(对于它的价值,如果脚本不是那么无用,我肯定会建议重写它以改用此处的文档)。

【讨论】:

  • 对于 while true 它不断说 could not open input file: No such file or directory
  • 你忘记了shebang,还是放了一个不间断的空格?
  • 立即查看更新以获取正确的 JSON 引号和 IP 地址字段中的修剪括号。
  • 您介意修改您的答案以显示 hoe 以将该信息放入可以调用的 html 页面吗?
  • 这是一个太宽泛的要求,无法轻松适应这个问题。我猜你问的是 CGI,但这可能最好在一个新的、单独的问题中涵盖,并附有详细的要求。
【解决方案2】:

如果对 JSON 格式的版本感兴趣:

对于这种 DD-WRT arp 格式:

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"},
]

【讨论】:

    猜你喜欢
    • 2013-12-25
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多