Показать полную графическую версию : [решено] Как вывести в лог значения из 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
и.т.д
@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
сейчас наблюдается такая картина »да нет, код из поста #2 у меня даёт ровные столбцы
Буквы которые в мак адресе были большими »@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
в список добавлялся новый компьютер если тот появился в arp -a »
если например в списке есть адрес с нулевым мак адресом то его в список не заносить »@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%"
в этойже последовательности »тогда уже не "добавить" (в конец текущего файла), а "вставить" в середину списка, что потребует копирования, удаления и повторного создания всего файла... например, путём сортировки (SORT /?)
и так сойдёт >не сойдет, так как выравнивание делает целая строка кода (выделена синим):
1) добавление в конец IP-адреса 8 пробелов,
2) обрезание строки по длине 15 символов.
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%"
можно както зделать чтобы он записывал все данные из лога в переменную
и потом просто записывал все данные занова с добавлением новых »в #8 так и сделано - добавил комментарий
создаётся не попорядку »сортировка сделана тупо по IP-адресам, а как надо?
...можете проверить сами (без учета заголовка):sort ARP.LOG
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 адреса хотелось бы чтобы шли по порядку, как показанно в примере выше
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.
если мак адрес машины изменился»может 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%"
спасибо
ещё проблемка
например
меняю в списке MAC адрес, в ручную
12.34.56.78 1234567890
на
12.34.56.78 0987654321
запускаю скрипт а мак не изменяется.
в списке arp -a как должно быть, только в логе он не изменяется
в кеше арп он написан так:
12.34.56.78 1234567890
скрипт меняет мак адрес, если из арп кеша он не совпадает, с маком адресом из списка »само собой, откуда скрипту знать что это кривой MAC, а не MAC выключенной машины?
эта машина включена, в арп кеше, мак адрес другой.
в предыдущем скрипте, если мак адрес в кеше другой а в списке другой, тогда его меняет на тот, который щас в данный момент в списке кеша.
просто мне нужно было если например
та машина у которой адрес был 12.34.56.78 1234567890
изменила свой ip на 12.34.56.79
то старая запись ip,mac удалялась, если мак совпал, с новой записью из кеша.
И записывалась новая 12.34.56.79 1234567890
root221, вроде понял о чем речь, исправил (#17 (http://forum.oszone.net/post-1712295-17.html))
да действительно всё работает.
Как после окончания всех записей в лог файл, вывести в консоль список, только тех компьютеров, которые присутствуют только в списке %LOG% но их небыло в списке arp/a кэша, в момент выполнения скрипта #17 (http://forum.oszone.net/post-1712295-17.html).
Пример, вывода в консоль:
Этих компьютеров из вашего списка %LOG%, небыло в списке кэша arp/a, в момент выполнения скрипта.
Эти компьютеры из списка %LOG%, отсутствуют в кэше arp/a:
IP - 002D8F9B5A2F
@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
)
как сделать ещё конфиг для переменных %LOG% и %ARP%
чтобы настройки переменных хранились в отдельном файле конфигурации например config.cfg
LOG=arp.log
ARP=ON
Foreigner
15-07-2011, 21:46
root221,
Если формат конфига: одна строчка -- имя_переменной=значение, то просто прочитать из батника:
for /f "tokens=*" %%i in (config.cfg) do 1>nul set "%%i"
После этого станут доступны переменные из файла
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.