-1

こんにちは、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 ADDRESSNAME OF THE DEVICEも含めるように変更したいと思います。

これは DD-WRT Web サイトで見つけましたが、コマンドを実行してディレクトリを確認すると、どこにも表示されません。

 # 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'('を試しましたが、うまくいかないようです。

4

2 に答える 2

1

まず、現在のスクリプトには信じられないほどの粗雑な部分が含まれています。それはちょうどにリファクタリングすることができます

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

からの出力にアクセスしdumpleasesないと、IP アドレス解決を追加する方法を実際に説明することはできませんがarp -n、多くの Linux では で IP アドレスが返され$1、解決されたアドレス (存在する場合) は なしで取得されます-n。しかし、Web サイトのスクリプトを見ると、必要なのはおそらく本当にdumpleases. Web サイトのスクリプトは、次のようにリファクタリングできます。

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

その部分や無限ループを気にしないのであれば、必要なのは出力を JSONwl assoclistにリファクタリングすることだけです。dumpleasesそれ$2 in aは、上記のスクリプトの後の部分です。(MACアドレスがwl assoclist生成するものだと思いました。出力サンプルがなければ、ここで多くのことを推測する必要があります。)


その場でスクリプトを生成することに関しては、それはばかげています。(ここでも少し推測しています)次のように見えるものはすべて

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

機能を失うことなく書き直すことができます

ssh busybox 'echo moo'

(スクリプトがそれほど役に立たない場合は、代わりにヒア ドキュメントを使用するようにスクリプトを書き直すことをお勧めします)。

于 2016-03-22T06:07:38.823 に答える