Войти

Показать полную графическую версию : [решено] Скрипт локальная синхронизация с дописыванием информации.


Corecess
20-11-2019, 23:44
Здравствуйте! Помогите, пожалуйста, со скриптом. Вопрос в следующем:
Есть постоянно изменяющийся файл. csv. Нужно чтобы этот файл синхронизировался в такой же файл, но в другой папке. При синхронизации информация, которая пропала в основном файле, пропадает и в том, куда синхронизируется. А нужно, что б информация не пропадала, а если появилась новая, то новая дописывалась. Я не сильна в этом, буду очень благодарна за помощь!

Iska
21-11-2019, 00:49
Corecess, тогда это ни разу не «синхронизация». То, что Вы описываете, попадает под категорию «Работа с базами данных».

Упакуйте Ваш .csv-файл в архив, каковой приложите к сообщению.

Corecess
21-11-2019, 03:17
Прилагаю архив. Это аудит беспроводных сетей. Точки доступа синхронизируют такие файлы на сервер. Проблема в том, что при потере устройств из вида их адреса в файле также удаляются. При перезагрузке точек доступа синхронизируется пустой файл, соответственно. Поэтому нужен такой скрипт, как я описала выше. Буду крайне признательна за помощь.

DJ Mogarych
21-11-2019, 09:18
CSV-файлом это можно назвать с натяжкой, так как он нормально не структурирован, т. е., столбцы идут один под другим.
Вы хотите просто добавлять информацию в общий файл?

Powershell:

gc C:\temp\1\test.csv-01.csv |Out-File C:\temp\123.txt -Append

Corecess
21-11-2019, 11:13
Да, не структурирован. В принципе, да, добавлять, но что б записывалась только новая информация. Что б было, наверное, что-то вроде сравнениея, если такой адрес в файле уже есть, то он пропускается, если нет, записывается. Или это уже целую программу надо писать?

DJ Mogarych
21-11-2019, 15:00
Адрес какой - MAC? Из какой колонки?

Все файлы одинаково выглядят, или все разные?

Исходный файл всё-таки один или их много?

Как должен выглядеть финальный файл?

Iska
21-11-2019, 18:10
Corecess, почему у Вас две строки наименований? Чем и как формируется данный файл?

Или это уже целую программу надо писать? »
Писать «целую программу» надо в любом случае.

Corecess
21-11-2019, 19:24
Две строки. Первый список - это MAC адреса точек доступа. Второй список - две колонки MAC адресов - это подключенные устройства и к каким точкам доступа подключены. Если ни к каким, во второй колонке not associated.
Файл формируется точкой доступа, линуксовским пакетом airodump-ng и синхронизируется на машину с виндовс. Т.е. если точка доступа перезагружается, то файл становится чистым. Соответственно на машине виндовс файл тоже становится чистым, теряются все данные. Нужно, чтобы эти данные не терялись.
Как я это видела - файл на виндовс, который синхронизируется с точкой доступа, в какой-то промежуток времени копируется в другую папку. Такой скрипт уже есть, спасибо DJ Mogarych.
Что бы не было тысячи файлов, файл должен дописываться, проверяя при этом совпадения и дописывать только те адреса, у которых нет совпадений, то есть новые.
Возможно, это должно выглядеть не так.

Файл всегда в таком виде, в каком есть. Файл один.

Дополню, что количество MAC адресов точек доступа будет меняться, как и количество адресов подключенных устройств

DJ Mogarych
21-11-2019, 21:35
Наверное, можно было бы поизящнее, но это работает.

Powershell:

$srcf = gc 'C:\temp\1\test.csv-01.csv'
$apstemp = 'C:\temp\1\apstemp.csv'
$clientstemp = 'C:\temp\1\clientstemp.csv'
$apsf = 'C:\temp\1\aps.csv'
$clientsf = 'C:\temp\1\clients.csv'

$srcf.where({$_ -notmatch "[\w\d]"},'Until') |ConvertFrom-Csv |export-csv "$apstemp" -NoTypeInformation -Append
$srcf.where({$_ -notmatch "[\w\d]"},'SkipUntil') |ConvertFrom-Csv |export-csv "$clientstemp" -NoTypeInformation -Append

import-csv "$apstemp" |sort BSSID -Unique |export-csv "$apsf" -NoTypeInformation -Delimiter ';'
import-csv "$clientstemp" |sort 'Station MAC' -Unique |export-csv "$clientsf" -NoTypeInformation -Delimiter ';'

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

Iska
21-11-2019, 22:09
Что бы не было тысячи файлов, файл должен дописываться, проверяя при этом совпадения и дописывать только те адреса, у которых нет совпадений, то есть новые. »
Corecess, это так не работает.

Первый вопрос: есть ли прямая и критическая зависимость между содержимым каких-то строк под первым заголовком, и содержимым каких-то строк под вторым заголовком? Есть ли между ними неразрывная связь?

Corecess
22-11-2019, 01:51
DJ Mogarych,

Спасибо! Работает!
Но смотрите, если устройство появилось в сети второй раз, тогда у него стоит другое время/флаги/мощность, и он дописывается еще раз, т.к. совпадение действительно не найдено. Возможно не учитывать эти данные? В конечном итоге мне нужны только уникальные мак адреса, если это упростить задачу. Или после выполнения этого скрипта, когда все размечено в таблице, выполнить еще один, взять адреса только из столбца А, получается, и еще раз прогнать их через сравнение/запись для получения только уникальных адресов. Возможно, я говорю глупости.

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

DJ Mogarych
22-11-2019, 08:48
Corecess, ещё раз: в файлах clientstemp.csv и apstemp.csv содержатся все данные.
В файлах clients.csv и aps.csv - только уникальные мак-адреса.

Corecess
22-11-2019, 12:02
DJ Mogarych, моя ошибка, голова уже забита была.

Вот смотрите, попробуйте скрипт с этим файлом. С тем, что был вначале, скрипт работает. Вот новый файл, с этим файлом вносится только clients.csv, aps.csv пустой, почему-то. Файл такого же формата и такой же структуры.

DJ Mogarych
22-11-2019, 12:15
А потому что файл другой - у него первая строка пустая. Добавил дополнительную обработку исходного файла, чтобы пустые строки, если они есть вначале, удалялись.


$srcf = (gc 'C:\temp\1\test.csv-01.csv').where({$_ -match "[\w\d]"},'skipuntil')
$apstemp = 'C:\temp\1\apstemp.csv'
$clientstemp = 'C:\temp\1\clientstemp.csv'
$apsf = 'C:\temp\1\aps.csv'
$clientsf = 'C:\temp\1\clients.csv'

$srcf.where({$_ -notmatch "[\w\d]"},'Until') |ConvertFrom-Csv |export-csv "$apstemp" -NoTypeInformation -Append
$srcf.where({$_ -notmatch "[\w\d]"},'SkipUntil') |ConvertFrom-Csv |export-csv "$clientstemp" -NoTypeInformation -Append

import-csv "$apstemp" |sort BSSID -Unique |export-csv "$apsf" -NoTypeInformation -Delimiter ';'
import-csv "$clientstemp" |sort 'Station MAC' -Unique |export-csv "$clientsf" -NoTypeInformation -Delimiter ';'

Corecess
22-11-2019, 17:07
DJ Mogarych, действительно, другой. Все работает, спасибо большое за помощь!




© OSzone.net 2001-2012