Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как вывести в лог значения из arp -a (http://forum.oszone.net/showthread.php?t=210933)

root221 11-07-2011 11:40 1711065

Как вывести в лог значения из arp -a
 
Вобщем такая задача, надо чтобы собиралась информация

из arp -a

и в лог записывались, только два значения.

Код:


IP Машины    Мак адрес


10.0.0.1      001BF6F69B13
10.0.0.91    00DD105979F5
10.0.0.100    00BF1327D4D3
10.0.0.190    001FF6B41BC5

и.т.д


amel27 11-07-2011 12:50 1711122

Код:

@echo off
SETLOCAL EnableDelayedExpansion
(
echo:ip              mac
echo:
for /f "tokens=1,2" %%a in ('arp -a^|findstr/brc:" *[0-9]"') do (
 set "$a=%%a        "& set "$b=%%b"
 echo !$a:~,15! !$b:-=!
))>arp.log


amel27 11-07-2011 18:04 1711377

Цитата:

Цитата root221
сейчас наблюдается такая картина »

да нет, код из поста #2 у меня даёт ровные столбцы
Цитата:

Цитата root221
Буквы которые в мак адресе были большими »

Код:

@echo off
SETLOCAL EnableDelayedExpansion
(echo:IP Машины      Мак адрес
 echo:
 for /f "tokens=1,2" %%a in ('arp -a^|findstr/brc:" *[0-9]"') do (
  set "$a=%%a        "& set "$b=%%b"
  for %%x in ("a=A" "b=B" "c=C" "d=D" "e=E" "f=F") do set "$b=!$b:%%~x!"
  echo !$a:~,15! !$b:-=!
))>arp.log


amel27 12-07-2011 04:25 1711627

Цитата:

Цитата root221
в список добавлялся новый компьютер если тот появился в arp -a »

Цитата:

Цитата root221
если например в списке есть адрес с нулевым мак адресом то его в список не заносить »

Код:

@echo off
SETLOCAL EnableDelayedExpansion
::-------------
set LOG=arp.log
::-------------
if not exist "%LOG%" (echo:IP Машины      Мак адрес&echo:)>"%LOG%"
(for /f "tokens=1,2" %%a in ('arp -a^|findstr/brc:" *[0-9]"') do (set "$b=%%b"
 set "$a=%%a        "& set "$a=!$a:~,15!"
 for %%x in ("-=" "a=A" "b=B" "c=C" "d=D" "e=E" "f=F") do set "$b=!$b:%%~x!"
 if not "!$b!"=="000000000000" findstr/ei "!$b!" "%LOG%">nul||echo !$a! !$b!
))>>"%LOG%"

Цитата:

Цитата root221
в этойже последовательности »

тогда уже не "добавить" (в конец текущего файла), а "вставить" в середину списка, что потребует копирования, удаления и повторного создания всего файла... например, путём сортировки (SORT /?)

Цитата:

Цитата root221
и так сойдёт >

не сойдет, так как выравнивание делает целая строка кода (выделена синим):
1) добавление в конец IP-адреса 8 пробелов,
2) обрезание строки по длине 15 символов.

amel27 12-07-2011 06:19 1711637

root221, как вариант:
Код:

@echo off
SETLOCAL EnableDelayedExpansion
::путь\имя лог-файла
set LOG=arp.log
::запись IP/MAC в переменные $$*
for /f "tokens=1,2" %%a in ('"(type "%LOG%"& arp/a)|findstr/brc:" *[0-9]""') do (
  set "$a=%%a        "& set "$a=!$a:~,15!"& set "$b=%%b"
  for %%x in ("-=" "a=A" "b=B" "c=C" "d=D" "e=E" "f=F") do set "$b=!$b:%%~x!"
  if not "!$b!"=="000000000000" set "$$!$b!=!$a!")
::вывод заголовка в новый файл
(echo:IP Машины      Мак адрес& echo:)>"%LOG%"
::добавление IP/MAC в файл (с сортировкой)
(for /f "tokens=1,2 delims==$" %%x in ('set $$') do @echo %%y %%x
)|sort >>"%LOG%"


amel27 12-07-2011 06:59 1711645

Цитата:

Цитата root221
можно както зделать чтобы он записывал все данные из лога в переменную
и потом просто записывал все данные занова с добавлением новых »

в #8 так и сделано - добавил комментарий

amel27 12-07-2011 07:29 1711649

Цитата:

Цитата root221
создаётся не попорядку »

сортировка сделана тупо по IP-адресам, а как надо?
...можете проверить сами (без учета заголовка):
Код:

sort ARP.LOG

root221 12-07-2011 07:30 1711650

Код:

10.0.0.1    001234567890
10.0.0.108  001234567890
10.0.0.11    001234567890
10.0.0.111  001234567890

Код:

а надо

 10.0.0.1 001234567890
 10.0.0.2 001234567890
 10.0.0.3 001234567890
 10.0.0.4 001234567890

и пошло поехало

последние цифры ip адреса хотелось бы чтобы шли по порядку, как показанно в примере выше

amel27 12-07-2011 08:21 1711662

root221, о том и речь, что сортировка может быть разной:
Код:

@echo off
SETLOCAL EnableDelayedExpansion
::путь\имя лог-файла
set LOG=arp.log
::сохранение IP/MAC в переменных $$*
for /f "tokens=1,2" %%a in ('"(type "%LOG%"&arp/a)|findstr/brc:" *[0-9]""') do (
  set "$a=%%a        "& set "$a=!$a:~,15!"& set "$b=%%b"& set "$="
  for %%x in ("-=" "a=A" "b=B" "c=C" "d=D" "e=E" "f=F") do set "$b=!$b:%%~x!"
  if not "!$b!"=="000000000000" (for %%x in (00!$a:.^= 00!) do set "$x=%%x"& set "$=!$!!$x:~-3!"
  set "$$!$!=!$a! !$b!"))
::вывод в файл
(echo:IP Машины      Мак адрес& echo:
 for /f "tokens=1* delims==" %%x in ('set $$') do echo %%y
)>"%LOG%"

P.S. При смене IP машины вариант #8 корректно исправит адрес для заданного MAC в списке, в этом варианте будет добавлена новая запись, старая будет висеть пока адрес не займёт другой хост. Так как 1-й скрипт отталкивается от MAC, второй - от IP.

amel27 13-07-2011 09:20 1712295

Цитата:

Цитата root221
если мак адрес машины изменился»

может IP адрес?
Код:

@echo off
SETLOCAL EnableDelayedExpansion
::путь\имя лог-файла
set LOG=arp.log
::сохранение IP/MAC в переменных $$*
for /f "tokens=1,2" %%a in ('"(arp/a&type "%LOG%")|findstr/brc:" *[0-9]""') do (
  set "$a=%%a        "& set "$a=!$a:~,15!"& set "$b=%%b"& set "$="
  for %%x in ("-=" "a=A" "b=B" "c=C" "d=D" "e=E" "f=F") do set "$b=!$b:%%~x!"
  for %%x in (00!$a:.^= 00!) do set "$x=%%x"& set "$=!$!!$x:~-3!"
  if not "!$b!"=="000000000000" if not defined $$!$! if not defined $_!$b! (
    set $_!$b!=.& set "$$!$!=!$a! !$b!"))
::вывод в файл
(echo:IP Машины      Мак адрес& echo:
 for /f "tokens=1* delims==" %%x in ('set $$') do echo %%y
)>"%LOG%"


root221 13-07-2011 10:11 1712321

спасибо

ещё проблемка

например

меняю в списке MAC адрес, в ручную

Код:

12.34.56.78  1234567890
на

Код:

12.34.56.78  0987654321
запускаю скрипт а мак не изменяется.

в списке arp -a как должно быть, только в логе он не изменяется


в кеше арп он написан так:

Код:

12.34.56.78  1234567890

amel27 13-07-2011 10:59 1712342

Цитата:

Цитата root221
скрипт меняет мак адрес, если из арп кеша он не совпадает, с маком адресом из списка »

само собой, откуда скрипту знать что это кривой MAC, а не MAC выключенной машины?

root221 13-07-2011 11:04 1712350

эта машина включена, в арп кеше, мак адрес другой.

в предыдущем скрипте, если мак адрес в кеше другой а в списке другой, тогда его меняет на тот, который щас в данный момент в списке кеша.

root221 13-07-2011 11:19 1712363

просто мне нужно было если например

та машина у которой адрес был 12.34.56.78 1234567890

изменила свой ip на 12.34.56.79

то старая запись ip,mac удалялась, если мак совпал, с новой записью из кеша.

И записывалась новая 12.34.56.79 1234567890

amel27 13-07-2011 11:25 1712366

root221, вроде понял о чем речь, исправил (#17)

root221 13-07-2011 11:39 1712380

да действительно всё работает.

root221 15-07-2011 01:56 1713723

Как после окончания всех записей в лог файл, вывести в консоль список, только тех компьютеров, которые присутствуют только в списке
Код:

%LOG%
но их небыло в списке arp/a кэша, в момент выполнения скрипта #17.

Пример, вывода в консоль:

Код:

Этих компьютеров из вашего списка %LOG%, небыло в списке кэша arp/a, в момент выполнения скрипта.

Эти компьютеры из списка %LOG%, отсутствуют в кэше arp/a:

IP - 002D8F9B5A2F


amel27 15-07-2011 04:51 1713754

Код:

@echo off
SETLOCAL EnableDelayedExpansion
::путь\имя лог-файла
set LOG=arp.log
set ARP=ON
::сохранение IP/MAC в переменных $$*
for /f "tokens=1,2" %%a in (
'"(arp/a&echo 0 000000000000&type "%LOG%")|findstr/brc:" *[0-9]""') do (
  if "%%a"=="0" set "ARP=OFF"
  set "$a=%%a        "& set "$a=!$a:~,15!"& set "$b=%%b"& set "$="
  for %%x in ("-=" "a=A" "b=B" "c=C" "d=D" "e=E" "f=F") do set "$b=!$b:%%~x!"
  for %%x in (00!$a:.^= 00!) do set "$x=%%x"& set "$=!$!!$x:~-3!"
  if not "!$b!"=="000000000000" if not defined $$!$! if not defined $_!$b! (
    set "$_!$b!=!ARP!"& set "$$!$!=!$a! !$b!"))
::вывод в файл
(echo:IP Машины      Мак адрес& echo:
 for /f "tokens=1* delims==" %%x in ('set $$') do echo %%y
)>"%LOG%"
::вывод расхождений в консоль
echo Эти компьютеры из списка "%LOG%" отсутствуют в кэше ARP:& echo:
for /f "tokens=1,2 usebackq" %%a in ("%LOG%") do (if "!$_%%b!"=="OFF" echo %%a - %%b
)


root221 15-07-2011 20:12 1714210

как сделать ещё конфиг для переменных %LOG% и %ARP%

чтобы настройки переменных хранились в отдельном файле конфигурации например config.cfg

Код:

LOG=arp.log
ARP=ON


Foreigner 15-07-2011 21:46 1714248

root221,
Если формат конфига: одна строчка -- имя_переменной=значение, то просто прочитать из батника:
Код:

for /f "tokens=*" %%i in (config.cfg) do 1>nul set "%%i"
После этого станут доступны переменные из файла

root221 16-07-2011 04:01 1714380

Foreigner, а если не одна ?

Я, указал, две переменные, которые должны выходить в конфиг.

Желательно, чтобы переменные в конфиге, читались из указанных строк.

Например, со второй и 4-ей строки, а параметр который будет в первой и 3-й строке, не читались вобще, т.к это будет коментарий, к двум параметрам, указанных ниже.


Код:

LOG=arp.log
ARP=ON


Iska 16-07-2011 05:52 1714385

Код:

; Мой комментарий 1
LOG=arp.log
; Мой комментарий 2
ARP=ON

Код:

for /f "tokens=* eol=;" %%i in (config.cfg) do 1>nul set "%%i"

Foreigner 16-07-2011 07:16 1714394

root221,
Да хоть сто одна, все переменные определятся. Если есть комментарии, то прими поправку от Iska.

root221 16-07-2011 08:10 1714399

У меня есть такой интерестный скрипт, который обсуждали в другой теме, но напишу его сдесь, с надежной, что вы мне тут же и поможете, сделать для него конфиг.

И вот он:

Код:

(for /l %%a in (1,1,254) do Echo CreateObject^("WScript.Shell"^).Run "ping -w 100 -n 1 10.0.0.%%a",0
 Echo WScript.Sleep^(3000^))>"%TEMP%\%~n0.vbs"
cscript /Nologo "%TEMP%\%~n0.vbs"
del "%TEMP%\%~n0.vbs"

пример

in (1,1,254) - 254 переписать в переменную и вывести в конфиг чтобы было вот так 10.0.13.254

10.0.13.%%a - ну и вот это, тоже в переменную. (А вот как сделать чтобы вот это число %%a было последним как выделенно в будущем конфиг файле)

например, чтобы я написал в файле конфига 254.254.254.254 и просканировались все 254.254.254.254 компьютеров.

Канечно же, как вы уже догадались, так я сканировать никогда небуду, просто я к тому, чтобы я мог в конфиге мог написать 10.0.13.254

и все компьютеры, c 1 по 254 просканировались, которые находятся в 13 подсети Это число тоже хотелось бы менять произвольно на другой номер подсети.

Как же это можно сделать, чтобы не писать отдельно число 254 в файле скрипта, создавая для него ещё одну переменную, внутри скрипта.

Вот так я бы хотел чтобы выглядел весь конфиг файл:

Код:

# Файл в котором хрянятся логи  кэша
LOG=file.txt
# Вывод в консоль ON= Только компьютеры, которых в момент проверки небыло в кэше.
# Вывод в консоль OFF= Только компьютеры, которые есть в списке лог файла.
ARP=ON

# Адрес сканирования, ((254) - количество запросов).
10.0.13.254

В данны момент, пока что мозгов хватило только на:

Код:

# Файл в котором хрянятся логи из таблицы кэша
LOG=file.txt
# Вывод в консоль ON= Только компьютеры, которых в момент проверки небыло в кэше.
# Вывод в консоль OFF= Только компьютеры, которые есть в списке лог файла.
ARP=ON

# Адрес сканирования, ((254) - количество запросов).
IPAddr=10.0.13.
IPNum=254

Foreigner,
Цитата:

Цитата Foreigner
Да хоть сто одна, все переменные определятся. Если есть комментарии, то прими поправку от Iska. »

Я только начал вникать, если что не так сказал, извини.)

твой скрипт работал, просто ошибки были, когда комментарии оставлял в конфиге, поэтому решил спросить, "а если не одна" =)

Foreigner 16-07-2011 08:43 1714408

root221,
Подставь те переменные, что указаны в конфиге в батник, например:
Код:

@echo off
setlocal

for /f "tokens=* eol=#" %%i in (config.cfg) do 1>nul set "%%i"

(for /l %%a in (1,1,%IPNum%) do ... "ping -w 100 -n 1 %IPAddr%%%a ...

ЗЫ. А зачем vbs из батника? Ведь все это можно и без vbs

Цитата:

Я только начал вникать, если что не так сказал, извини.)
За что? Ты спросил я ответил.

root221 16-07-2011 09:40 1714439

Цитата:

Цитата Foreigner
Подставь те переменные, что указаны в конфиге в батник, например:

Код:

@echo off
setlocal
for /f "tokens=* eol=#" %%i in (config.cfg) do 1>nul set "%%i"
(for /l %%a in (1,1,%IPNum%) do ... "ping -w 100 -n 1 %IPAddr%%%a ... »


Вы мне ещё написали несовсем так, как я хотел, вы мне написали так, как у меня сейчас сделано, о чём я писал выше.

Config.cfg
Заметтьте, я хотел чтобы число писалось не отдельно, как у вас %IPNum%, а слитно вместе с IP

чтобы не так было:

Код:


IPAddr=10.0.13.
IPNum=254

а вот, так

Код:

IPAddr=10.0.13.254

Foreigner 16-07-2011 13:35 1714535

Цитата:

Цитата root221
потому что я просто обновляю арп кеш, т.к через vbs посылается разом 254 запроса а если через cmd то по 1-му каждые 100 милисекунд »

Единственный плюс для vbs -- не создаются окна. А пинг и в cmd идет одновременно по всем адресам:
Код:

for %%i in (ya.ru mail.ru google.ru) do start ping -n 11 %%i

root221 18-07-2011 12:07 1714871

Цитата:

Цитата Foreigner

Про такой приём я знаю, вот только 255 компьютеров вбивать в одну строку, я устану.

Код:

for /l %%a in (1,1,254) do ping -w 100 -n 1 10.0.0.%%a
255 окон открывается разом а через VBS этого невидно.

root221 18-07-2011 12:48 1714919

так что насчёт конфига ? его вобще можно сделать ?

хотябы

Код:

s=10.0.0.1
po=10.0.0.254


amel27 18-07-2011 16:53 1715068

Цитата:

Цитата root221
так что насчёт конфига ? »

пост #29

amel27 20-07-2011 12:41 1716282

Цитата:

Цитата root221
вот конфиг
Код:
IPAddress=10.0.13.
IPCos=254
Ещё раз повторюсь, а хочу я, чтобы было именно так!
Код:
IPAddress=10.0.13.254 »

Код:

@echo off

for /f "tokens=*" %%i in (config.cfg) do set "%%i">nul
for /f "tokens=4 delims=." %%i in ("%IPAddress%") do set "IPCos=%%i"

set IP
pause


amel27 21-07-2011 03:42 1716798

Цитата:

Цитата root221
ip=10.0.13.254 »

было же вроде так:
Цитата:

Цитата root221
Ещё раз повторюсь, а хочу я, чтобы было именно так!
Код:
IPAddress=10.0.13.254 »



Время: 06:49.

Время: 06:49.
© OSzone.net 2001-