Сценарий Bash передает переменную, которая является шестнадцатеричным числом, в поиск Perl Regex для сопоставления 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

Я пытаюсь идентифицировать третий октет MAC-адреса в списке поиска производителя (https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf). Я хочу, чтобы сценарий передавал переменную 55, B3, b3, FF в однострочник perl и вставлял ее в регулярное выражение MAC, а затем выводил совпадения построчно. Пока что без переменной он найдет каждый MAC-адрес в файле, обозначен ли он символом: или a - и является ли это строкой из 6 октетов или строк из 3 октетов. с переменной env ничего не возвращает. Я все перепробовал и вроде ничего не работает. Я ударился о стену

Я также хочу иметь возможность выполнять вторичное сопоставление на основе 3-го и 4-го октета и третичное сопоставление на основе 3-го, 4-го и 5-го октетов, но это далеко не просто заставить его работать.


person Community    schedule 20.03.2016    source источник


Ответы (3)


Чтобы передать переменную оболочки в однострочник Perl, используйте параметр -s. Например:

SOME_VAR=test
perl -se 'print $var' -- -var=$SOME_VAR
person bart    schedule 20.03.2016
comment
эта линия работает. Он печатает, например, c2, если я установил переменную как c2 в bash. Как бы интегрировать его в строчку: - person ; 21.03.2016
comment
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 - person ; 21.03.2016
comment
кроме замены -ne на se? Я изменил -ne на -se и изменил $ octet на $ var и добавил - -var = $ SOME_VAR после 'и перед manuf.txt, но это не работает - person ; 21.03.2016
comment
Вам нужны как -n (для чтения файла manuf.txt), так и -s. Таким образом, упрощенный однострочник будет выглядеть так: perl -nse 'print if /$octet/' -- -octet=$octet manuf.txt - person bart; 21.03.2016
comment
поэтому я меняю его на: perl -nse 'print if / [0-9A-F] {2} [: -] [0-9A-F] {2} [: -] ($ ENV {' $ octet '} ) [: -] [0-9A-F] {2} [: -] [0-9A-F] {2} [: -] [0-9A-F] {2} (? = ((\ S ) | (\ /))) / ig '- -octet = $ octet manuf.txt - person ; 21.03.2016
comment
и он ничего не печатает, когда я ввожу c2 в качестве переменной. Я знаю, что в файле есть третий октет, в котором написано c2 - person ; 21.03.2016
comment
Измените "$ENV{'$octet'}" на $octet. %ENV используется для доступа к переменным среды из Perl, что вам не нужно, поскольку переменная передается как $octet. - person bart; 21.03.2016
comment
Это почему-то странно, когда я использую 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 он печатает только совпадения с символом: и игнорирует совпадения с символом - - person ; 21.03.2016
comment
Большое спасибо за вашу помощь, третий октет сопоставляется с: и - после создания отдельных наборов запросов для альтернативной нотации - person ; 21.03.2016

Почему бы просто не сделать все это на 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 );

ЕСЛИ вы хотите сопоставить несколько, тогда самый простой способ - это, вероятно, переформатировать ваш ввод, чтобы он был слепым разделителем, и regex сопоставил его. Что-то вроде этого:

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

Преобразует разделители ввода в : независимо от того, что кто-то дает. Итак, вы можете ввести:

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

Затем вы можете выполнить сопоставление в цикле - вместо проверки сопоставления октета используйте сопоставление с регулярным выражением:

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

Теперь здесь используются регулярные выражения, так что на самом деле это совпадение подстроки. Он также не привязан к якорю, поэтому, если вы введете «0A», вы все сопоставите с 0A в строке.

Но вместо этого вы могли бы:

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

Но тогда вам всегда придется вводить «стартовые» октеты. (Но и в этот момент было бы несложно поддерживать ввод регулярных выражений).

person Sobrique    schedule 20.03.2016
comment
Этот сценарий работает в точности так, как я хотел, но в автономном режиме. Как бы вы его изменили, чтобы я мог ввести в качестве ввода c2: 00 или c2: 00: 00? - person ; 21.03.2016
comment
ах, в идеале я хотел бы получить результат для ввода в скрипт perl при его запуске. поэтому я мог бы получить результат 00: 50: C2: D5: 60: 22, я бы сначала хотел попробовать C2: D5: 60, затем, если совпадений C2: D5 нет, то, если совпадений C2 нет, попытаться получить наименьший возможный список. rn на третьем октете, я получаю 4000 совпадений, но если я выполняю поиск в текстовом редакторе для C2: D5: 60, я получаю один результат, C2: D5 16 результатов - person ; 21.03.2016
comment
Я мог бы просто заменить все - в файле производителя на: затем следуйте вашему предложению, чтобы отформатировать ввод в нотацию: если я это сделал, как я мог бы переписать сценарий, чтобы использовать C2: 56: 40 в качестве входной переменной, попробуйте C2 : 56: 40, за которым следует C2: 56, за которым следует C2? - person ; 21.03.2016
comment
Я собираюсь потратить некоторое время и поиграться с этим, опубликую свои результаты, когда у меня будет что-то, что работает так, как я хочу. Еще раз спасибо за вашу помощь! - person ; 21.03.2016

Мой последний код оказался

  #!\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

Не очень красиво, но он выполняет свою работу и создает список совпадений, полезных для кода PoC.

person Community    schedule 29.03.2016