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

0

Я ищу, чтобы автоматизировать что-то с помощью сценария в 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 раз. Кроме того, я получу больше списков в будущем.

Максим
источник
Каков формат каждого файла? Можно ли добавить выдержку, конечно, без настоящих имен?
Тото
Для списка я мог бы использовать csv, xls, txt. Выходные данные конфигурации Cisco ASA - просто файл на коробке linux.
максима
Вы можете перейти к grep -fфайлу со словами для поиска, может быть grep -FnH -f <( sed -nr 's/^>([[:alnum:]]+) +([[:alnum:]]+).*/\1\n\2/p' list.txt ) config.txt.
Пауло,

Ответы:

1

Вот 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
Toto
источник
Большое спасибо. Сегодня я найду время, чтобы проверить его, внести изменения, если это необходимо, и сообщить вам результат.
изречение
Очень хорошо! Работает с первого раза. Я попытаюсь понять, что вы здесь сделали, потому что я не очень хорош в сценариях и программировании. Можно ли также избавиться от пустых строк ": найдена строка х"? У меня сейчас +7000 строк. Как я мог сделать скрипт, чтобы он возвращал только совпадения? Во всяком случае, это мне уже очень помогает. Так что большое спасибо!
изречение
@maxim: Пожалуйста, рад, что это помогает. Извините, я не получаю информацию о пустых строках, скрипт выводится в выходной файл, только если есть совпадение. Вы имеете в виду, что в list.txt есть пустые строки?
Тото
В list.txt нет пустых строк. Но выходной файл записывает каждую строку моего файла config.txt, например, «найденная строка 7081». Он начинается с 1 и заканчивается на 7114. Файл config.txt также содержит 7114 строки. Между этими 7114 строками в выходном файле я вижу такие совпадения: "schaba27: конфиденциальная найденная строка 5319".
изречение
@maxim: Изменение $users{$user} = $name ;в $users{$user} = $name if $user and $name;см мой выбор.
Тото
0

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

прямой вывод

awk 'NR>2{print $1,$2}' list.txt | while IFS=" " read -r username fullname; do awk -v name="${username}" 'BEGIN{OFS="|"}match($0,/'"${fullname}"'/){gsub(/>/,"",name);print name,NR,$0}' config.txt; done

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

awk 'NR>2{print $1,$2}' list.txt | while IFS=" " read -r username fullname; do awk -v name="${username}" 'BEGIN{OFS="|"}match($0,/'"${fullname}"'/){gsub(/>/,"",name);print name,NR,$0>>"output.txt"}' 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
Горгона
источник