Войти

Показать полную графическую версию : [решено] Как вывести в лог значения из arp -a


Страниц : [1] 2

root221
11-07-2011, 11:40
Вобщем такая задача, надо чтобы собиралась информация

из 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
@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
сейчас наблюдается такая картина »да нет, код из поста #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

amel27
12-07-2011, 04:25
в список добавлялся новый компьютер если тот появился в 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 символов.

amel27
12-07-2011, 06:19
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
можно както зделать чтобы он записывал все данные из лога в переменную
и потом просто записывал все данные занова с добавлением новых »в #8 так и сделано - добавил комментарий

amel27
12-07-2011, 07:29
создаётся не попорядку »сортировка сделана тупо по IP-адресам, а как надо?
...можете проверить сами (без учета заголовка):sort ARP.LOG

root221
12-07-2011, 07:30
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
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
если мак адрес машины изменился»может 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
спасибо

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

например

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

12.34.56.78 1234567890

на

12.34.56.78 0987654321

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

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


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

12.34.56.78 1234567890

amel27
13-07-2011, 10:59
скрипт меняет мак адрес, если из арп кеша он не совпадает, с маком адресом из списка »само собой, откуда скрипту знать что это кривой MAC, а не MAC выключенной машины?

root221
13-07-2011, 11:04
эта машина включена, в арп кеше, мак адрес другой.

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

root221
13-07-2011, 11:19
просто мне нужно было если например

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

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

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

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

amel27
13-07-2011, 11:25
root221, вроде понял о чем речь, исправил (#17 (http://forum.oszone.net/post-1712295-17.html))

root221
13-07-2011, 11:39
да действительно всё работает.

root221
15-07-2011, 01:56
Как после окончания всех записей в лог файл, вывести в консоль список, только тех компьютеров, которые присутствуют только в списке %LOG% но их небыло в списке arp/a кэша, в момент выполнения скрипта #17 (http://forum.oszone.net/post-1712295-17.html).

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

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

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

IP - 002D8F9B5A2F

amel27
15-07-2011, 04:51
@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
как сделать ещё конфиг для переменных %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