Bash-Skript zur Überprüfung der Namensliste mit einer Firewall-Konfigurationsdatei

407
maxim

Ich suche etwas mit einem Skript in Bash oder Python zu automatisieren.

Nehmen wir an, ich habe eine Konfigurationsdatei von einem Gerät. Eine einfache config.txt-Datei. Der Inhalt könnte so sein (die eigentliche Datei ist viel länger und enthält mehr Text):

> 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 


Meine zweite Datei ist eine Liste (list.txt). Und der Inhalt und das Layout ist ungefähr so ​​(in notepad ++):

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 

Ist es möglich, ein Skript auszuführen, das jedes Wort in der Spalte "Benutzername" und "vollständiger Name" der Datei "list.txt" enthält, und prüfen, ob in der Datei "config.txt" eine Übereinstimmung vorliegt? Es wäre großartig, wenn die Ausgabe des Skripts in einer dritten Datei enthalten wäre, die angibt, welches Wort (hier Benutzername oder vollständiger Name) in der Datei config.txt zu finden ist und wo.

Angenommen, ich möchte wissen, ob sich test38 irgendwo in der Datei config.txt befindet? Ich kann jetzt einfach grep, aber meine list.txt-Datei hat ungefähr 100 Benutzer. Ich möchte nicht 100 mal grep. Außerdem bekomme ich in Zukunft mehr Listen.

0
Welches Format hat jede Datei? Könnte einen Auszug hinzufügen, natürlich ohne echte Namen? Toto vor 6 Jahren 0
Für die Liste könnte ich csv, xls, txt verwenden. Die Konfigurationsausgabe des Cisco ASA ist nur eine Datei in einer Linux-Box. maxim vor 6 Jahren 0
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/64941/discussion-between-maxim-and-toto). maxim vor 6 Jahren 0
Sie könnten eine Datei mit den zu suchenden Wörtern an "grep -f" übergeben, beispielsweise "grep -FnH -f <(sed -nr's / ^> ([[: alnum:]] +) + ([[: alnum:]] +). * / \ 1 \ n \ 2 / p 'list.txt) config.txt`. Paulo vor 6 Jahren 0

2 Antworten auf die Frage

1
Toto

Hier ist ein Perl-Skript, das die Arbeit erledigt (soweit ich es verstehe):

#!/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/; } } 

Ausgabedatei für gegebenes Beispiel

test38:confidential2 found line 30 test47:confidential3 found line 32 
Danke vielmals. Ich werde mir heute Zeit nehmen, um es zu testen, gegebenenfalls Änderungen vorzunehmen und Ihnen das Ergebnis mitzuteilen. maxim vor 6 Jahren 0
Sehr schön! Funktioniert ab dem ersten Mal. Ich werde versuchen zu verstehen, was Sie hier gemacht haben, weil ich nicht gut mit Skripten und Programmieren umgehen kann. Kann man auch die leeren Zeilen ": gefundene Zeile x" loswerden? Ich habe jetzt +7000 Zeilen. Wie kann ich das Skript so erstellen, dass es nur die Übereinstimmungen zurückgibt? Jedenfalls hilft mir das schon sehr. Vielen herzlichen Dank! maxim vor 6 Jahren 0
@maxim: Gern geschehen, froh, dass es hilft. Sorry, ich verstehe Sie nicht über leere Zeilen, das Skript wird nur dann in der Ausgabedatei gedruckt, wenn es eine Übereinstimmung gibt. Meinen Sie, es gibt leere Zeilen in list.txt? Toto vor 6 Jahren 0
Keine leeren Zeilen in list.txt. Das Outfile schreibt jedoch jede Zeile meiner config.txt-Datei wie zum Beispiel ": found line 7081". Es beginnt bei 1 und endet bei 7114. Die Datei config.txt zählt auch 7114 Zeilen. Zwischen diesen 7114 Zeilen im Outfile kann ich die Übereinstimmungen wie folgt sehen: "schaba27: vertrauliche gefundene Zeile 5319". maxim vor 6 Jahren 0
@maxim: Ändere $ user {$ user} = $ name; `in` $ users {$ user} = $ name, wenn $ user und $ name; `meine Bearbeitung sehen. Toto vor 6 Jahren 0
@maxim: oder direkt nach der while-Schleife `while (my ($ u, $ n) = each (% users)) {`, fügen Sie die Zeile hinzu: `next, außer $ u und $ n;` Toto vor 6 Jahren 0
: -o tat genau das, was ich gefragt habe. Ich wünschte, ich hätte deinen Perl-Level :-p. maxim vor 6 Jahren 0
@maxim: Glücklich, es funktioniert für dich. Sie können die Antwort als akzeptiert markieren, siehe: https://superuser.com/help/someone-answers Toto vor 6 Jahren 0
0
Gorgon

Nach meinem persönlichen Verständnis über Ihre Anfrage verwende ich integrierte Befehle whileund Befehle awk, um diese zu lösen.

direkt ausgegeben

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

Ausgabe in Datei schreiben output.txt

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

Ausgabeformat ist

user name|line no.|match content 

Ergebnisausgabe

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