Richard Bagshaw wrote:
>
> I'm very new to perl and I have been trying to solve a problem for a few
> days now, I am reading a file that I use to setup my firewall rules on a
> Linux box, the file contains many lines, but as an example I will show
> just two here :-
>
> iptables -A INPUT -p tcp -s 123.45.678.90 --dport 22 -j ACCEPT
>
> and ...
>
> iptables -A INPUT -p tcp --dport 25 -j ACCEPT
>
> As you can see, the main difference is that line one has the "source ip"
> listed, where as line 2 doesn't. I am writing a regex to basically pull
> all of the pertinent parts from the lines. The below expression works
> perfectly for the first line, but for the 2nd line it does not work. I
> know "why" it doesn't work, but cannot find the correct syntax for
> alternation to make the 2nd line work.
>
> if (/(INPUT) -p (...) -s ([0-9\.]*) --dport ([0-9]+) -j ([A-Za-z].*)/gi) {
> ... code here ...
> }
>
> $1 = INPUT
> $2 = UDP or TCP
> $3 = <IP of SOURCE>
> $4 = <PORT>
> $5 = ACCEPT or REJECT or DROP
>
> Any help would be appreciated.
If $1 is always 'INPUT' then why capture it? Case is usually important or do
-s and -S do the same thing? If you want parsing similar to a shell then all
you need to do is parse on whitespace:
if ( /INPUT -p (\S+) (?:-s (\S+))? --dport (\S+) -j (\S+)/ ) {
If you are trying to use a regular expression to verify that the data is
correct then something like this _may_ work:
if ( /INPUT
\s*
-p \s* (udp|tcp)
\s*
(?: -s \s* ( (?: 0?\d?\d | 1\d\d | 2 (?: [0-4]\d | 5[0-5] ) )
(?: \. (?: 0?\d?\d | 1\d\d | 2 (?: [0-4]\d | 5[0-5] ) ) ){3} ) )?
\s*
--dport \s* (\d{1,5})
\s*
-j \s* ([A-Za-z]\S*)
/x ) {
Or you could "cheat" and let Getopt::Long parse it for you:
$ perl -MGetopt::Long -MData::Dumper -e'
$_ = q[iptables -A INPUT -p tcp -s 123.45.678.90 --dport 22 -j ACCEPT];
my %h;
{ local @ARGV = split;
GetOptions( \%h, "A=s", "p=s", "s=s", "dport=i", "j=s" );
}
print Dumper \%h;
'
$VAR1 = {
'A' => 'INPUT',
'p' => 'tcp',
's' => '123.45.678.90',
'j' => 'ACCEPT',
'dport' => 22
};
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>