Скрипт Bash для перекрестной проверки списка имен с помощью файла конфигурации брандмауэра

315
maxim

Я ищу, чтобы автоматизировать что-то с помощью сценария на Bash или Python.

Допустим, у меня есть файл конфигурации с устройства. Простой файл config.txt. Содержимое может быть таким (реальный файл намного длиннее и содержит гораздо больше текста):

> cat config.txt >  > ASA Version 9.1(5)  > ! > terminal width 511 > hostname confidential > domain-name confidential > enable password encrypted > passwd encrypted > names > ! > interface GigabitEthernet0/0 > nameif interconnection > security-level 50 > ip address 1.1.1.1 255.255.255.240 standby 1.1.1.1  > ! > interface GigabitEthernet0/1 > description Trunk > no nameif > no security-level > no ip address > ! > interface GigabitEthernet0/1.4 > description confidential > vlan 4 > nameif vlan004_confidential > security-level 50 > ip address 1.1.1.1 255.255.255.0  > ! > object network confidential > host 2.2.2.2 > object network confidential2 > host 3.3.3.3 > object network confidential3 > host 4.4.4.4 >! >access-list vlan65_access_in extended permit object-group confidential any object-group confidential  >access-list vlan65_access_in remark Allow ICMP OK-20131105 >access-list vlan65_access_in extended permit icmp any object vlan48-confidential  >access-list vlan65_access_in remark Allow NTP OK-20131105 >access-list vlan65_access_in extended permit udp any object-group confidential eq ntp  >access-list warehouse_access_in remark Access to confidential >access-list warehouse_access_in extended permit object-group confidential any object-group confidential  >access-list warehouse_access_in remark Access to DNS srvrs >access-list warehouse_access_in extended permit ip any object-group DNS_Servers  >access-list warehouse_access_in remark Allow acces to AD >! >no pager >logging enable >logging timestamp >logging standby >logging list SysLogs message 304001 >logging list connections message 302013-302304 >logging list NewConnection message 302303 >logging list NewConnection message 302015 >logging list NewConnection message 302013 >logging list NewConnection message 303002 >logging list Dropped message 106001-106103 >logging list ConfigChange message 111008 >logging list ConfigChange message 111001 >logging list ConfigChange message 111010 >logging buffer-size 1048576 >logging monitor debugging >logging buffered warnings >! >access-group vlan4_access_in in interface vlan004_confidential1 >access-group vlan65_access_in in interface vlan065_confidential2 >access-group vlan66_access_in in interface vlan066_confidential3 >access-group vlan80_access_in in interface vlan080_confidential4 >! >service-policy global_policy global >service-policy test interface interconnection >service-policy imec_intranet_traffic-policy interface vlan065_confidential5 >service-policy imec_intranet_traffic-policy interface vlan066_confidential6 >service-policy imec_intranet_traffic-policy interface vlan080_confidential7 >service-policy imec_intranet_traffic-policy interface vlan082_confidential8 >service-policy imec_intranet_traffic-policy interface vlan083_confidential9 >! >: end 


Мой второй файл - это список (list.txt). А содержимое и макет примерно такие (в блокноте ++):

list.txt

>username full name employid group left comp on >---------------------------------------------------------------------------------- >test16 confidential1 00014241 zzzz1 19-08-2017 >test38 confidential2 00014223 zzzz2 12-08-2017 >test47 confidential3 00013986 zzzz3 06-07-2017 >test85 confidential4 00013923 zzzz4 16-07-2017 

Можно ли запустить скрипт, который берет каждое слово в столбце «имя пользователя» и «полное имя» в файле list.txt и проверяет, есть ли совпадение в файле config.txt? Было бы здорово иметь выходные данные сценария в третьем файле, в котором упоминается, какое слово (здесь имя пользователя или полное имя) находится в файле config.txt и где.

Допустим, я хочу знать, находится ли test38 где-нибудь в файле config.txt? Теперь я могу просто grep, но мой файл list.txt имеет около 100 пользователей. Я не хочу grep 100 раз. Кроме того, я получу больше списков в будущем.

0
Каков формат каждого файла? Можно ли добавить выдержку, конечно, без настоящих имен? Toto 6 лет назад 0
Для списка я мог бы использовать csv, xls, txt. Выходные данные конфигурации Cisco ASA - просто файл на коробке linux. maxim 6 лет назад 0
Давайте [продолжим это обсуждение в чате] (http://chat.stackexchange.com/rooms/64941/discussion-between-maxim-and-toto). maxim 6 лет назад 0
Вы можете передать в `grep -f` файл со словами для поиска; это может быть` grep -FnH -f <(sed -nr 's / ^> ([[: alnum:]] +) + ([[:: alnum:]] +). * / \ 1 \ n \ 2 / p 'list.txt) config.txt`. Paulo 6 лет назад 0

2 ответа на вопрос

1
Toto

Вот Perl-скрипт, который делает эту работу (насколько я понимаю):

#!/usr/bin/perl use strict; use warnings;  my $config = 'config.txt'; # give the full path my $list = 'list.txt'; # give the full path my $outfile = 'outfile.txt'; # give the full path  # read list file and store in a hash open my $fhl, '<', $list or die "unable to open '$list': $!"; my %users; while(my $line = <$fhl>) { next if $. < 3; # skip first 2 lines (header) my ($user, $name) = split(/\s+/, $line); $users{$user} = $name if $user and $name; } close $fhl;  open my $fhc, '<', $config or die "unable to open '$config': $!"; open my $out, '>', $outfile or die "unable to open '$outfile': $!"; # read config line by line while(my $line = <$fhc>) { # loop on all users while( my ($u,$n) = each(%users)) { # print outputfile if user found  print $out "$u:$n found line $.\n" if $line =~ /\b($u|$n)\b/; } } 

выходной файл для данного примера

test38:confidential2 found line 30 test47:confidential3 found line 32 
Большое спасибо. Сегодня я найду время, чтобы проверить его, внести изменения, если необходимо, и сообщить вам результат. maxim 6 лет назад 0
Очень хорошо! Работает с первого раза. Я попытаюсь понять, что вы здесь сделали, потому что я не очень хорош в сценариях и программировании. Можно ли также избавиться от пустых строк ": найдена строка х"? У меня сейчас +7000 строк. Как я мог сделать скрипт, чтобы он возвращал только совпадения? Во всяком случае, это мне уже очень помогает. Так что большое спасибо! maxim 6 лет назад 0
@maxim: Пожалуйста, рад, что это помогает. Извините, я не получаю информацию о пустых строках, скрипт выводится в выходной файл, только если есть совпадение. Вы имеете в виду, что в list.txt есть пустые строки? Toto 6 лет назад 0
В list.txt нет пустых строк. Но выходной файл записывает каждую строку моего файла config.txt, например, ": найдена строка 7081". Он начинается с 1 и заканчивается на 7114. Файл config.txt также содержит 7114 строки. Между этими 7114 строками в выходном файле я вижу такие совпадения: "schaba27: конфиденциальная найденная строка 5319". maxim 6 лет назад 0
@maxim: Измените `$ users {$ user} = $ name;` на `$ users {$ user} = $ name, если $ user и $ name;`, смотрите мои правки. Toto 6 лет назад 0
@maxim: или, сразу после цикла while `while (my ($ u, $ n) = each (% users)) {`, добавьте строку: `next, если только $ u и $ n;` Toto 6 лет назад 0
: -то сделал именно то, что я просил. Хотел бы я, чтобы у тебя был уровень perl :-p. maxim 6 лет назад 0
@maxim: Рад, что это работает для вас. Не стесняйтесь пометить ответ как принятый, см .: https://superuser.com/help/someone-answers Toto 6 лет назад 0
0
Gorgon

Согласно моему личному пониманию вашего запроса, я использую встроенную команду whileи команду awkдля ее решения.

прямой вывод

awk 'NR>2' list.txt | while IFS=" " read -r username fullname; do awk -v name="$" 'BEGINmatch($0,/'"$"'/)' config.txt; done 

записать вывод в файл output.txt

awk 'NR>2' list.txt | while IFS=" " read -r username fullname; do awk -v name="$" 'BEGINmatch($0,/'"$"'/)' config.txt; done 

выходной формат

user name|line no.|match content 

Вывод результата

test16|64|>access-group vlan4_access_in in interface vlan004_confidential1 test38|30|> object network confidential2 test38|65|>access-group vlan65_access_in in interface vlan065_confidential2 test47|32|> object network confidential3 test47|66|>access-group vlan66_access_in in interface vlan066_confidential3 test85|67|>access-group vlan80_access_in in interface vlan080_confidential4 

Похожие вопросы