Script Bash untuk mencentang daftar nama dengan file konfigurasi firewall

0

Saya mencari untuk mengotomatiskan sesuatu dengan skrip bash atau python.

Katakanlah saya memiliki file konfigurasi dari perangkat. File config.txt sederhana. Konten bisa seperti ini (file sebenarnya lebih panjang dan memiliki lebih banyak teks):

> 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


File kedua saya adalah daftar (list.txt). Dan konten dan tata letaknya kira-kira seperti ini (di 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

Apakah mungkin menjalankan skrip yang mengambil setiap kata di kolom "nama pengguna" dan "nama lengkap" di file list.txt dan memeriksa apakah ada kecocokan dalam file config.txt? Akan lebih bagus untuk memiliki output dari skrip di file ketiga yang menyebutkan kata apa (di sini nama pengguna atau nama lengkap) ditemukan di file config.txt dan di mana.

Katakanlah saya ingin tahu apakah test38 ada di dalam file config.txt? Saya sekarang dapat dengan mudah melakukan grep, tetapi file list.txt saya memiliki sekitar 100 pengguna. Saya tidak ingin mencapai 100 kali. Selain itu, saya akan mendapatkan lebih banyak daftar di masa depan.

pepatah
sumber
Apa format setiap file? Bisa menambahkan ekstrak, tentu saja tanpa nama asli?
Toto
Untuk daftar saya bisa menggunakan csv, xls, txt. Keluaran config dari Cisco ASA hanyalah sebuah file pada kotak linux.
maksim
Anda bisa meneruskan ke grep -ffile dengan kata-kata untuk mencari, bisa jadi grep -FnH -f <( sed -nr 's/^>([[:alnum:]]+) +([[:alnum:]]+).*/\1\n\2/p' list.txt ) config.txt.
Paulo

Jawaban:

1

Berikut adalah skrip perl yang melakukan pekerjaan, (sejauh yang saya mengerti):

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

outputfile untuk contoh yang diberikan

test38:confidential2 found line 30
test47:confidential3 found line 32
Toto
sumber
Terimakasih banyak. Saya akan meluangkan waktu hari ini untuk mengujinya, membuat perubahan jika perlu dan memberi tahu Anda hasilnya.
maksim
Sangat bagus! Bekerja dari pertama kali. Saya akan mencoba memahami apa yang Anda lakukan di sini karena saya tidak pandai menulis dan memprogram. Apakah mungkin untuk menghilangkan baris kosong ": ditemukan baris x"? Saya memiliki +7000 baris sekarang. Bagaimana saya bisa membuat skrip yang hanya mengembalikan kecocokan? Pokoknya ini sudah banyak membantu saya. Jadi, terima kasih banyak!
maksim
@ Maxim: Terima kasih, senang bisa membantu. Maaf, saya tidak mengerti tentang baris kosong, skrip hanya mencetak pada outputfile jika ada kecocokan. Apakah Anda berarti ada baris kosong di list.txt?
Toto
Tidak ada baris kosong di list.txt. Tetapi file outfile menulis setiap baris file config.txt saya sebagai contoh ": found line 7081". Dimulai pada 1 dan berakhir pada 7114. File config.txt juga menghitung 7114 baris. Di antara 7114 baris di pengaburan saya dapat melihat pertandingan seperti ini: "schaba27: secret found line 5319".
maksim
@mimim: Ubah $users{$user} = $name ;ke $users{$user} = $name if $user and $name;, lihat edit saya.
Toto
0

Menurut pemahaman pribadi saya tentang permintaan Anda, saya menggunakan perintah whiledan perintah builtin awkuntuk menyelesaikannya.

langsung menghasilkan

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

tulis output ke file 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

format output adalah

user name|line no.|match content

Hasil keluaran

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
Gorgon
sumber