[arp] mac filteren

Pagina: 1
Acties:
  • 435 views sinds 30-01-2008
  • Reageer

  • cman
  • Registratie: Oktober 2002
  • Laatst online: 21:07
Ik loop al een uurtje of wat te zoeken op google en tweakers voor een antwoord, maar kan het niet vinden, ik gok dus ook dat het niet bestaat, maar toch maar eens proberen:

Ik ben een batchfile aan het maken dat alle pc's in mijn netwerk pingt en ip's van de online pc's in een txt'je opslaat.. Nu zou ik in dat txt'je niet enkel het ip willen maar ook het bijhorende mac-adres. Dus ben ik aan de slag gegaan met het commando arp. Na elke ping die een antwoord krijgt, een arp -a [ipadres].... Maar dan krijg ik dus een lijstje met het ip en het mac, en ik zou dus enkel het mac willen.. Ik ben nog niet zo lang bezig met batchfiles en heb eigenlijk geen idee hoe ik dat mac adres eruit kan filteren. Of is dit mogelijk met het arp commando zelf te doen (niet dat ik vond alleszins).

Ja ik weet dat er al honderden dergelijke progjes te downloaden zijn op het internet, maar hoe leer je daar iets uit? :)

BOE


Verwijderd

cman schreef op donderdag 03 augustus 2006 @ 13:53:
Ik loop al een uurtje of wat te zoeken op google en tweakers voor een antwoord, maar kan het niet vinden, ik gok dus ook dat het niet bestaat, maar toch maar eens proberen:

Ik ben een batchfile aan het maken dat alle pc's in mijn netwerk pingt en ip's van de online pc's in een txt'je opslaat.. Nu zou ik in dat txt'je niet enkel het ip willen maar ook het bijhorende mac-adres. Dus ben ik aan de slag gegaan met het commando arp. Na elke ping die een antwoord krijgt, een arp -a [ipadres].... Maar dan krijg ik dus een lijstje met het ip en het mac, en ik zou dus enkel het mac willen.. Ik ben nog niet zo lang bezig met batchfiles en heb eigenlijk geen idee hoe ik dat mac adres eruit kan filteren. Of is dit mogelijk met het arp commando zelf te doen (niet dat ik vond alleszins).

Ja ik weet dat er al honderden dergelijke progjes te downloaden zijn op het internet, maar hoe leer je daar iets uit? :)
for loopje. dit werkt voor 1... als je meerdere ipaddressen wilt mag je ff gaan puzzelen :)

set ipaddress=192.168.1.1
for /f "tokens=2" %a in ('arp -a^|find /i "%ipaddress%"') do echo %a

  • cman
  • Registratie: Oktober 2002
  • Laatst online: 21:07
ok, ik ben er ondertussen achtergekomen dat mijn vraag redelijk erm, dwaas is :) In principe heb ik wat ik wil hebben maar moet ik het dus gaan 'uitlezen' in mijn batchbestand.

BOE


  • cman
  • Registratie: Oktober 2002
  • Laatst online: 21:07
iis5_rulez:
ik kan er niet echt aan uit, die %a waar dient die voor? daar geeft hij namelijk een foutmelding op.
ik vermoed dat tokens=2 verwijst naar de tweede kolom, dus de kolom met het mac-adres? en dat je dan dat mac-adres wil toewijzen aan a? De syntax is op deze manier niet correct?

EDIT:
mijn excuses voor het kicken, even niet aan de edit functie gedacht...

EDIT2: en niet aan het feit dat je in een batch bestand twee keer % moet gebruiken voor je variabelen 8)7

Nu zit ik alleen nog met het probleem dat ik dit bat bestand uitvoer op een pc met ip adres 10.189.13.18, en als je dan het mac opvraagt van 10.189.13.1 => dan geeft hij eerst een echo van mijn eigen ip voor hij het macadres weergeeft, vermits dit ip voorkomt als je het commando arp -a ingeeft.. Ik was zelf aan het denken dat het misschien mogelijk is om in de for lus iets toe te voegen waardoor alleen exact matches tellen, maar in de help van de for functie staat daar niets over in..

[ Voor 56% gewijzigd door cman op 03-08-2006 16:26 ]

BOE


Verwijderd

idd %%a in batch. ik had het ff op cmdline getest, dus vandaar dat ik er maar 1 % had neergezet.

arp -a|find /i "10.189.13.18" geeft dus de exacte match. in de output van arp grep (om het unix commando maar eens te gebruiken) de regel met het ipnummer daarin.

De for loop voert ook niks anders uit dan wat er tussen () staat. Je exacte match moet je dus specificeren tussen de quotes (in dit geval een commando, maar het kan ook een string of tekstfile zijn).

edit: oh ik zie inderdaad dat als je je eigen ip opvraagt je inderdaad eerst je eigen ip geechoed krijgt.

output arp -a

Interface: 10.189.13.18 --- 0x10003
Internet Address Physical Address Type
10.189.13.18 00-16-35-04-d5-5b dynamic
10.189.13.1 00-00-5e-00-01-02 dynamic

arp -a|find /i "10.189.13.18"

Interface: 10.189.13.18 --- 0x10003
10.189.13.18 00-16-35-04-d5-5b dynamic

je moet het dus nog ver specificeren:

arp -a|find /i "10.189.13.18"|find /i "dynamic"

10.189.13.18 00-16-35-04-d5-5b dynamic

De "token=2" geeft inderdaad alleen de 2de waarde terug (aangezien de default delimter een spatie is).

[ Voor 71% gewijzigd door Verwijderd op 03-08-2006 16:54 ]


  • cman
  • Registratie: Oktober 2002
  • Laatst online: 21:07
ik denk dat je me verkeerd begrijpt iis5_rulez:

de pc waar ik het batch bestand op uitvoer heeft als ip 10.189.13.18. Nu wil ik het mac-adres hebben van de pc met ip 10.189.13.1. Maar als uitvoer krijg ik twee dingen: eerst '10.189.13.18' en daarna pas het mac adres van pc 10.189.13.1. Dit omdat 10.189.13.1 voorkomt in 10.189.13.18 (en wanneer je een arp -a doet, dan wordt er op de eerste regel eerst je eigen ip adres weergegeven een tweede kolom, dus wordt dit ip adres dan ook weergegeven). Ik hoop dat je begrijpt wat ik bedoel. Ik ben nu eens aan het kijken naar findstr ipv find, omdat je daar de optie /x kan meegeven wat inhoudt dat het echt een exact match moet zijn, maar daar kom ik dan weer tegen het probleem aangelopen dat die enkel in bestanden kan gaan kijken en niet in uitvoer van een vorig commando...

BOE


Verwijderd

findstr kan ook prima de output van het vorige commando uitlezen. Alleen /x betekent, heel de line moet matchen :)

Verwijderd

zo werkt tie wel (tenminste niet getest)

set ipaddress=x.x.x.x
for /f "tokens=1,2" %%a in (arp -a^|find /i "ipaddress") do call :findmac %%a %%b
goto :eof

:findmac
:: %1 = ipaddress %2 = mac. Echo mac alleen als ipadress precies gelijk is aan x.x.x.x
if "%ipaddress%"=="%1" do echo %2
goto :eof

edit vervang je dan nog "set ipaddress" door

for /f "tokens=1" %%a in (filename.txt) do call :findit %%a
goto :eof

:findit
set ipaddress=%1

dan kan je een voor een lijst met ipaddressen in filename.txt de mac adressen vinden.

[ Voor 28% gewijzigd door Verwijderd op 03-08-2006 17:11 ]


  • cman
  • Registratie: Oktober 2002
  • Laatst online: 21:07
ok ik denk dat ik er bijna ben, dit is mijn code tot nu toe:

cls
if exist pingIP.txt (del pingIP.txt)
for /L %%A in (1,1,254) do call :check %1.%%A

:check
ping -n 1 %1 | find "TTL" >NUL
if not errorlevel 1 (set ipaddress=%1)
if not errorlevel 1 (for /f "tokens=1,2" %%a in ('arp -a^|find /i "ipaddress"') do call :findmac %%a %%b)

:findmac
:: %1 = ipaddress %2 = mac. Echo mac alleen als ipadress precies gelijk is aan x.x.x.x
if "%ipaddress%"=="%1" echo %ipaddress% %2%>>pingIP.txt

Maar hier loopt het op het einde mis.. Hij geeft wel netjes de ip-adressen die online zijn weer in het txt file'tje maar in %2 staat niet het mac-adres, maar de waarde '1'. Dit wordt echt ook niet in het txt'tje gezet. Waar hij dat vandaan haalt is mij voorlopig nog een raadsel.. Is het misschien beter om deze regel:

if not errorlevel 1 (for /f "tokens=1,2" %%a in ('arp -a^|find /i "ipaddress"') do call :findmac %%a %%b)

te vervangen door:

if not errorlevel 1 (call :zoekmac)

en dan in :zoekmac die for-lus?

EDIT
Ik bedenk me net dat dit nu eigenlijk niet meer in het subforum netwerken thuis hoort...

[ Voor 6% gewijzigd door cman op 04-08-2006 10:54 ]

BOE


Verwijderd

2 foutjes in je batch... geen goto :eof (goto end of file) waardoor je altijd in de 2de loop terecht komt, ook als je die niet aanroept. in de for /f statement staat "ipaddress" ipv "%ipaddress%".

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
:beginbatch
if exist pingIP.txt (del pingIP.txt) 
for /L %%A in (1,1,254) do call :check %1.%%A
goto :eof

:check
ping -n 1 %1 | find "TTL"
if not errorlevel 1 (set ipaddress=%1)
if not errorlevel 1 (for /f "tokens=1,2" %%a in ('arp -a^|find /i "%ipaddress%"') do call :findmac %%a %%b)
goto :Eof
:: als je hier geen goto :eof zet, loopt je door naar :findmac. geen reden om dat te proberen met niet gevonden ip adressen.

:findmac
:: %1 = ipaddress %2 = mac. Echo mac alleen als ipadress precies gelijk is aan x.x.x.x
if "%ipaddress%"=="%1" echo %ipaddress% %2%>>pingIP.txt
goto :eof


overigens geef je nu handmatig op welke iprange je moet pingen. Mac adressen kunnen alleen gevonden worden in je eigensubnet.

code:
1
2
3
4
5
6
7
8
for /f "tokens=2 delims=:" %%a in ('ipconfig^|find /i "ip"') do call :determinerange %%a
goto :beginbatch

:determinerange
:: whitespaces are being truncated
set iprange=%1
for /f "tokens=1-3 delims=." %%a in ("%iprange%") do set iprange=%%a.%%b.%%c
goto :eof


en dan check %1.%%a vervangen door %iprange%.%%a

[ Voor 31% gewijzigd door Verwijderd op 04-08-2006 11:58 ]


  • cman
  • Registratie: Oktober 2002
  • Laatst online: 21:07
Eeuwige roem voor jou iis5_rulez :)
Het werkt perfect :) Nu eens kijken of ik nog wat uitbreidingen kan toevoegen mbv. nbtstat.

BOE

Pagina: 1