2016-03-20 1 views
0

Je dois me frapper la tête contre le mur en essayant de comprendre ce que je fais mal. Mon code est actuellement ceci:Bash Script passe une variable qui est un nombre hexadécimal à un Perl Regex Recherche pour correspondre à l'adresse MAC

#!\bin\sh 

read -p "Enter Third Octet Here " octet 
perl -ne 'while(/[0-9A-F]{2}[:-][0-9A-F]{2}[:-]("$ENV{'$octet'}")[:-][0-9A-F]{2}[:-][0-9A-F]{2}[:-][0-9A-F]{2}(?=((\s)|(\/)))/ig){print "$&\n";}' manuf.txt 
perl -ne 'while(/[0-9A-F]{2}[:-][0-9A-F]{2}[:-]("$ENV{'$octet'}")(?=((\s)|(\/)))/ig){print "$&\n";}' manuf.txt 

Ce que je suis en train de faire est d'identifier le troisième octet d'une adresse MAC à une liste de recherche du fabricant (https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf). Je veux que le script passe la variable 55, B3, B3, FF à la doublure perl et l'insère dans l'expression rationnelle de MAC, puis l'impression correspond ligne par ligne. Jusqu'à présent, sans la variable, il trouvera toutes les adresses MAC du fichier, qu'elles soient marquées d'un: ou de a - et qu'il s'agisse d'une chaîne de 6 octets ou d'une chaîne de 3 octets. avec la variable d'env, elle ne retourne rien. J'ai tout essayé et rien ne semble fonctionner. Je frappe un mur

Je veux aussi être en mesure de faire une correspondance secondaire basée sur les 3ème et 4ème octets et une correspondance tertiaire basée sur les 3ème et 4ème et 5ème octets, mais c'est un objectif éloigné au-delà de simplement l'obtenir au travail

Répondre

3

Pour passer la variable shell à un doublure Perl, utilisez l'option -s. Par exemple:

+0

lui donnant une shot rn –

+0

cette ligne fonctionne. Il imprime, par exemple c2 si je mets la variable comme c2 dans bash. Comment l'intégrer dans la ligne: –

+0

perl -ne 'while (/ [0-9A-F] {2} [: -] [0-9A-F] {2} [: -] ("$ ENV { '$ octet'} ") [: -] [0-9A-F] {2} [: -] [0-9A-F] {2} [: -] [0-9A-F] {2} (? = ((\ s) | (\ /)))/ig) {print "$ &\n";} 'manuf.txt –

1

Pourquoi ne pas tout faire en perl?

#!/usr/bin/env perl 
use strict; 
use warnings; 

#get input 
print "Enter third octet:\n"; 
chomp (my $input = <>); 

#open our file for reading. 
open (my $manuf, '<', 'manuf.txt') or die $!; 

#iterate line by line 
while (<$manuf>) { 
    #match instances of octets from the file, into $mac 
    my ($mac) = m/((?:[0-9a-fA-F]{2}[:-]?){3})/ or next; 
    #split it on 'nonwords' which means pretty much any delimiter. 
    #map {lc} lowercases the elements, this makes the whole thing case 
    #insensitive. 
    my @octets = map { lc } split /\W/, $mac; 
    #print if there's a match 
    print if $octets[2] eq lc $input; 
} 

close ($manuf); 

SI vous voulez faire correspondre aux multiples, le plus simple est de reformater probablement votre entrée pour être aveugle delimiter et regex égaler. Quelque chose comme ceci:

$input =~ s/\W/:/g; 

convertira les délimiteurs d'entrée à : indépendamment de ce que quelqu'un donne. Ainsi, vous pouvez entrer:

00:00:0A 
00-0A-00 
00 0A-FF 

Ensuite, vous pouvez faire correspondre à la boucle - plutôt que de tester un match d'octet, utilisez un match de regex:

while (<$manuf>) { 
    my ($mac) = m/^((?:[0-9a-fA-F]{2}[:-]?){3})/ or next; 
    my $reformatted_mac = join ":", map { lc } split /\W/, $mac; 
    print if $reformatted_mac =~ m/$input/; 
} 

Maintenant, cela utilise des expressions régulières, donc c'est en fait une correspondance de sous-chaîne. Il est également non ancré, donc si vous 'entrez' '0A' vous allez tout correspondre avec un 0A dans la chaîne.

Mais vous pouvez à la place:

print if $reformatted_mac =~ m/^$input/; 

Mais vous aurez toujours d'entrer dans les octets « à partir ». (Mais il ne serait pas trop difficile de supporter les entrées regex à ce moment-là aussi).

+0

merci: DI va essayer aussi –

+0

Ce script fonctionne exactement comme je le voulais, mais seul. Comment voulez-vous le changer afin que je puisse entrer "c2: 00" ou "c2: 00: 00" comme entrée? –

+0

ah, idéalement, je voudrais grep'ing un résultat à entrer dans le script Perl quand il s'exécute. donc je pourrais obtenir un résultat qui est 00: 50: C2: D5: 60: 22, je voudrais essayer C2: D5: 60 d'abord, alors si aucune correspondance C2: D5, alors si C2 ne correspond pas pour essayer d'obtenir la plus petite liste possible. rn sur le troisième octet, je reçois 4000 matches, mais si je fais une recherche dans mon éditeur de texte pour C2: D5: 60 j'obtiens un résultat, C2: D5 16 résultats –

0

Mon code final a fini par être

#!\bin\sh 
 
#requires perl 
 
#requires manuf.txt available from wireshark 
 
#requires last 4 octets of mac address available from Ubertooth-scan 
 
#use responsibly and don't use for any unauthorized purposes 
 
#based in part on code from http://stackoverflow.com/questions/36119396/bash-script-passes-variable-that-is-a-hex-number-to-a-perl-regex-search-to-match?noredirect=1#comment59878958_36119396 
 

 
read -p "Enter Third and Fourth and Fifth and Sixth Octet Here (AB:CD:EF:12) " STR 
 

 
octet6=$(echo $STR | cut -c 1-11) 
 
octet5=$(echo $STR | cut -c 1-8) 
 
octet4=$(echo $STR | cut -c 1-5) 
 
octet=$(echo $STR | cut -c 1-2) 
 

 
#Makes sure the manuf.txt file only contains ":" notation 
 
sed -i 's/-/:/ig' manuf.txt 
 

 
#third and fourth and fifth octet 
 
perl -nse 'print if /[0-9A-F]{2}[:][0-9A-F]{2}[:]$octet[:][0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}(?=((\s)|(\/)))/ig' -- -octet=$octet5 manuf.txt 
 

 
perl -nse 'print if /[0-9A-F]{2}[:][0-9A-F]{2}[:]$octet(?=((\s)|(\/)))/ig' -- -octet=$octet5 manuf.txt 
 

 
#third and fourth octet 
 
perl -nse 'print if /[0-9A-F]{2}[:][0-9A-F]{2}[:]$octet[:][0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}(?=((\s)|(\/)))/ig' -- -octet=$octet4 manuf.txt 
 

 
perl -nse 'print if /[0-9A-F]{2}[:][0-9A-F]{2}[:]$octet(?=((\s)|(\/)))/ig' -- -octet=$octet4 manuf.txt 
 

 
#Third octet. Kind of pointless bc it might generate hundreds or thousands of matches 
 
perl -nse 'print if /[0-9A-F]{2}[:][0-9A-F]{2}[:]$octet[:][0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}(?=((\s)|(\/)))/ig' -- -octet=$octet manuf.txt 
 

 
perl -nse 'print if /[0-9A-F]{2}[:][0-9A-F]{2}[:]$octet(?=((\s)|(\/)))/ig' -- -octet=$octet manuf.txt 
 

 
#Trim things up and make them look neat and tidy 
 
sed -i -E 's/^([0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}).*/\1/g' matches.txt 
 
sed -i -E 's/^([0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2})\s.*/\1/ig' matches.txt 
 

 
#Replace everything after the third octet with the rest of the Mac address for 6 octetc strings 
 
sed -i -E 's/^([0-9A-F]{2}[:][0-9A-F]{2}[:])[0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}[:][0-9A-F]{2}/\1'$octet6'/g' matches.txt 
 

 
#Replace everything after the third octet with the rest of the Mac address for 3 octetc strings 
 
sed -i -E 's/^([0-9A-F]{2}:[0-9A-F]{2}):[0-9A-F]{2}$/\1:'$octet6'/g' matches.txt 
 

 
#Remove repeated strings 
 
sed -i '$!N; /^\(.*\)\n\1$/!P; D' matches.txt

Pas assez, mais il fait le travail et il crée une liste des correspondances utiles pour un code PoC