Сравните идентификационные номера с номерами ревизий в двух файлах, и если rev # для файла A меньше, чем файл B, замените строку на новый rev #?

У меня есть файл правил. В каждой строке есть sid: число с номером rev:.

Я хочу сравнить этот файл с обновленным файлом, однако не вся строка будет обновлена.

Если одна из строк с одинаковым номером sid: number имеет более высокий номер rev: мне нужно заменить его на более высокий номер rev:.

Это то место, где я до сих пор

grep -oP "sid:[0-9]{0,11}; rev:[0-9]{0,3}" all_rules.rules | while read line; do if grep -q "$line" /home/path/update_rules.rules; then echo updated; else echo > /dev/null; fi done 

Это пример файла all.rules:

 alert udp $HOME_NET any -> any 53 (msg:"ET TROJAN CopyKittens? Matryoshka DNS Lookup 1 (winupdate64 . com)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|0b|winupdate64|03|com|00|"; nocase; distance:0; fast_pattern; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/Operation_Wilted_Tulip.pdf; classtype:trojan- activity; sid:2024495; rev:1;) alert udp $HOME_NET any -> any 53 (msg:"ET TROJAN CopyKittens? Matryoshka DNS Lookup 2 (twiter-statics . info)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|0e|twiter|2d|statics|04|info|00|"; nocase; distance:0; fast_pattern; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/Operation_Wilted_Tulip.pdf; reference:md5,752240cddda5acb5e8d026cef82e2b54; classtype:trojan- activity; sid:2024496; rev:1;) alert udp $HOME_NET any -> any 53 (msg:"ET TROJAN CopyKittens? Cobalt Strike DNS Lookup (cloudflare-analyse . com)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|12|cloudflare|2d|analyse|03|com|00|"; nocase; distance:0; fast_pattern; threshold:type limit, track by_src, count 1, seconds 60; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/Operation_Wilted_Tulip.pdf; reference:md5,752240cddda5acb5e8d026cef82e2b54; classtype:trojan- activity; sid:2024497; rev:1;) 

Вот пример update.rules:

 alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"ET TROJAN Revcode RAT CnC"; flow:established,to_server; content:"POST"; http_method; content:".php"; http_uri; content:"keyauth="; http_client_body; fast_pattern; depth:8; content:"&key="; http_client_body; distance:0; content:"&uid="; http_client_body; distance:0; content:!"Referer|3a|"; http_header; content:"WinHttpRequest"; http_header; metadata: former_category TROJAN; reference:md5,3f652d9bc17a4be3c0e497ea19848344; classtype:trojan-activity; sid:2024500; rev:1; metadata:affected_product Windows_XP_Vista_7_8_10_Server_32_64_Bit, attack_target Client_Endpoint, deployment Perimeter, signature_severity Major, created_at 2017_07_27, performance_impact Moderate, updated_at 2017_07_27;) alert udp $HOME_NET any -> any 53 (msg:"ET TROJAN CopyKittens? Matryoshka DNS Lookup 1 (winupdate64 . com)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|0b|winupdate64|03|com|00|"; nocase; distance:0; fast_pattern; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/Operation_Wilted_Tulip.pdf; classtype:trojan- activity; sid:2024495; rev:2;) alert udp $HOME_NET any -> any 53 (msg:"ET TROJAN CopyKittens Matryoshka DNS Lookup 2 (twiter-statics . info)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|0e|twiter|2d|statics|04|info|00|"; nocase; distance:0; fast_pattern; metadata: former_category TROJAN; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/Operation_Wilted_Tulip.pdf; reference:md5,752240cddda5acb5e8d026cef82e2b54; classtype:trojan-activity; sid:2024496; rev:2; metadata:affected_product Windows_XP_Vista_7_8_10_Server_32_64_Bit, attack_target Client_Endpoint, deployment Perimeter, signature_severity Major, created_at 2017_07_25, malware_family Matryoshka, performance_impact Moderate, updated_at 2017_07_25;) alert udp $HOME_NET any -> any 53 (msg:"ET TROJAN CopyKittens Cobalt Strike DNS Lookup (cloudflare-analyse . com)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|12|cloudflare|2d|analyse|03|com|00|"; nocase; distance:0; fast_pattern; threshold:type limit, track by_src, count 1, seconds 60; metadata: former_category TROJAN; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/Operation_Wilted_Tulip.pdf; reference:md5,752240cddda5acb5e8d026cef82e2b54; classtype:trojan-activity; sid:2024497; rev:2; metadata:affected_product Windows_XP_Vista_7_8_10_Server_32_64_Bit, attack_target Client_Endpoint, deployment Perimeter, signature_severity Major, created_at 2017_07_25, malware_family CobaltStrike, performance_impact Moderate, updated_at 2017_07_26;) alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"ET TROJAN Win32/BanloadDownloader.XZY Retrieving Payload"; flow:to_server,established; content:"GET"; http_method; content:"/sosdoudou_V3/"; http_uri; fast_pattern; content:"WinHttp.WinHttpRequest"; http_header; content:!"Accept-"; http_header; content:!"Referer|3a 20|"; http_header; metadata: former_category TROJAN; reference:md5,98376de10118892f0773617da137c2be md5,599ea45f5420f948e0836239eb3ce772; classtype:trojan-activity; sid:2024499; rev:2; metadata:affected_product Windows_XP_Vista_7_8_10_Server_32_64_Bit, attack_target Client_Endpoint, deployment Perimeter, signature_severity Major, created_at 2017_07_26, malware_family Banload, performance_impact Moderate, updated_at 2017_07_26;) 

Обратите внимание, что существуют три правила, которые являются одинаковыми sid:2024497 , sid:2024496 и sid:2024495 однако update.rules содержит исправления обновлений. Я хочу заменить старый rev внутри моего файла all.rules новым редактором правила в моем update.rules.

Надеюсь это поможет..

  • Как я могу автоматически вводить пароль из .bash_profile при запуске команды в качестве sudo?
  • Как получить IP-адрес с помощью сценария оболочки?
  • Замена определенного номера в файлах unix
  • Когда `ls -s` печатает" 0 "
  • case + как реализовать равный или меньше или больше в случае синтаксиса
  • Условные аргументы
  • как создать скрипт для резервного копирования баз данных MySQL на отдельные файлы?
  • Как создать исполняемый скрипт bash для этих команд?
  • 3 Solutions collect form web for “Сравните идентификационные номера с номерами ревизий в двух файлах, и если rev # для файла A меньше, чем файл B, замените строку на новый rev #?”

    Это работает для меня при минимальном тестировании:

     #!/bin/zsh typeset -A rule sidrev while read -r line; do sid=${${line/*sid:/}/;*/} rev=${${line/*rev:/}/;*/} if [[ "$rev" -gt "$sidrev[$sid]" ]]; then sidrev[$sid]="$rev" rule[$sid]="$line" fi done echo -E ${(F)rule} 

    Сценарий читает правила snort на stdin и на stdout выводит последнюю версию всего прочитанного.

    Сделал некоторые предположения, чтобы получить какой-то ответ. Эти предположения:

    1. Однонаправленное обновление: update_rules (или входной файл 2) является справочным файлом для актуального
    2. Справочный файл будет содержать только самую актуальную или, по крайней мере, такую ​​же ревизию, как и файл для обновления (входной файл 1). Это означает, что проверка проверки (IF2) фактически не равна = = IF1 как таковой. Achtung!
    3. Я полагаюсь на разницу между IF1 и IF2. Не уверен, насколько велика (в подсчете количества строк) разница между обоими, это может иметь влияние

    Во всяком случае, достаточно с blabla, к мясистым частям

     #!/bin/bash cp "$1" "copy_$1" #backup file we're going to change #then only extract sid + rev (cut -f cols) + sort #do that for both file and diff them with RCS format > see output of script for example #and filter to keep only the sid (prob worth testing without grep to see output) var=($(diff -n <(egrep -oe "sid:[0-9]{0,11}; rev:[0-9]{0,3}" $1|sort -k2) <(egrep -oe "sid:[0-9]{0,11}; rev:[0-9]{0,3}" $2|sort -k 2) | egrep -oe "sid:[0-9]{0,11};" )) #Now loop over each SID for i in ${var[@]}; do #Extract line number in IF1 oldline=$(grep -n $i $1|cut -f1 -d:) #Extract replacement line in IF2 newline=$(grep $i $2.txt) #awk magic see (note sed was a pain, couldn't get it to work :/) >> https://askubuntu.com/questions/434051/how-to-replace-a-string-on-the-5th-line-of-multiple-text-files awk -v nline="$oldline" -v repl="$newline" '(NR==nline){$0=repl}1;' "copy_$1" > "f.tmp" && mv "f.tmp" "copy_$1" done #then highlight diff between copy and original // you'll still need to mv "copy_$1" "$1" for it to be applied diff -n "copy_$1" "$1" 

    Оберните все это в скрипте, затем назовите его:

    ./my_script.sh all_rules.rules /home/path/update_rules.rules

    Вы не perl , но я предполагаю, что это нормально использовать, поскольку вы упомянули awk , sed и grep . Я выбрал perl а не awk главным образом потому, что гораздо проще работать с многоуровневыми ассоциативными массивами («Хеш-хэши» или «HoH» в perl lingo), чем в awk .

     #!/usr/bin/perl use strict; # array used to keep track of the order each sid was first seen, # so that they can be printed out in the same order. # Necessary because perl hashes are inherently un-ordered. my @order=(); # hashed array to contain the highest rev seen of each sid. my %S = (); # count of the number of files we've read completely so far. my $filenum=0; while(<>) { s/^\s*|\s*$//g; # strip leading and trailing spaces if (m/^$/) { $filenum++ if eof; next }; # skip empty lines # extract the sid and the rev my ($sid, $rev) = $_ =~ (m/^.*; sid:(\d+); rev:(\d+)/) ; # store or update an anonymous hash containing the rev and the entire # line in the hash, keyed by the sid. if (defined($S{$sid})) { $S{$sid} = { rev => $rev, line => $_ } if ( ($rev > $S{$sid}->{rev}) ); } else { next if ($filenum); # only store sid if we're still reading the 1st file. push @order, $sid; $S{$sid} = { rev => $rev, line => $_ }; }; $filenum++ if eof; }; # if you want output sorted by the sid, comment the first of the next # two lines and uncomment the second for my $sid (@order) { #for my $sid (sort keys %S) { print $S{$sid}->{line}, "\n"; }; 

    Сохраните его как, например, ./apply-update.pl и запустите его как ./apply-update.pl all.rules update.rules > out.rules

    Вывод из ваших новых входных файлов образца будет всего лишь тремя строками (с all.rules , наблюдаемыми в all.rules , как обновлено update.rules , то есть update.rules «rev: 2», а не «rev: 1»):

     alert udp $home_net any -> any 53 (msg:"et trojan copykittens? matryoshka dns lookup 1 (winupdate64 . com)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|0b|winupdate64|03|com|00|"; nocase; distance:0; fast_pattern; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/operation_wilted_tulip.pdf; classtype:trojan- activity; sid:2024495; rev:2;) alert udp $home_net any -> any 53 (msg:"et trojan copykittens matryoshka dns lookup 2 (twiter-statics . info)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|0e|twiter|2d|statics|04|info|00|"; nocase; distance:0; fast_pattern; metadata: former_category trojan; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/operation_wilted_tulip.pdf; reference:md5,752240cddda5acb5e8d026cef82e2b54; classtype:trojan-activity; sid:2024496; rev:2; metadata:affected_product windows_xp_vista_7_8_10_server_32_64_bit, attack_target client_endpoint, deployment perimeter, signature_severity major, created_at 2017_07_25, malware_family matryoshka, performance_impact moderate, updated_at 2017_07_25;) alert udp $home_net any -> any 53 (msg:"et trojan copykittens cobalt strike dns lookup (cloudflare-analyse . com)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|12|cloudflare|2d|analyse|03|com|00|"; nocase; distance:0; fast_pattern; threshold:type limit, track by_src, count 1, seconds 60; metadata: former_category trojan; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/operation_wilted_tulip.pdf; reference:md5,752240cddda5acb5e8d026cef82e2b54; classtype:trojan-activity; sid:2024497; rev:2; metadata:affected_product windows_xp_vista_7_8_10_server_32_64_bit, attack_target client_endpoint, deployment perimeter, signature_severity major, created_at 2017_07_25, malware_family cobaltstrike, performance_impact moderate, updated_at 2017_07_26;) 

    Это будет во много раз быстрее, чем любая версия на основе bash – интерпретаторы оболочек просто не так быстро работают с текстовой обработкой, как perl или awk или python . Скомпилированный язык, такой как C , будет намного быстрее, но написать что-то подобное в C, вероятно, будет, по меньшей мере, 50 или 60, возможно, даже нескольких сотен строк C-кода, а не 15 строк perl (не считая комментариев или пробелов линии).

    Interesting Posts

    Убирать все PDF-файлы в каталоге, сохраняя структуру каталогов

    inittab эквивалент в fedora 15?

    Отключить хранилище паролей открытого текста svn для всех пользователей

    Что это за файл: .readahead в моем корневом каталоге?

    Как я могу туннелировать трафик для NAT-узла на другой сервер?

    Сенсорная панель не реагирует на возобновление сна на Debian 8

    Упрощенная обработка параметров сценария оболочки

    Не удается прочитать прежнюю внутреннюю файловую систему hdd через usb (конфликт имен группы томов fedora)

    Есть ли утилита для демонтизации процессов в пользовательском пространстве?

    IP к команде консоли консоли

    Пакеты, перешедшие через мост Linux, имеют очень высокую вероятность задержки пакетов и задержки?

    Команда Solaris 10, pkgtrans

    Извлечение частей имени файла csv в столбцах

    Как получить разницу между числами с помощью dc?

    Сценарий удаленного резервного копирования SSH

    Linux и Unix - лучшая ОС в мире.