Gå til innhold

Lage en løkke og skrive resultatet til fil


Anbefalte innlegg

jeg har ikke så veldig peiling på perl (ennå) så jeg henvender meg derfor til dere som kan det så mye bedre enn meg.

 

Her er scenariet (eller slik jeg har sett for meg at det løses):

Jeg mater scriptet med en gitt ip-adresse (klasse c-adresse). det bør også kunne hente ip-adressen til maskinen selv. (vet at php har støtte for å hente ip-adresser og da bør vel perl ha det også synes jeg....) Scriptet kutter så av den siste oktetten av ip-adressen. Så legger den tallene 1-254 til ip-adressen som 'erstatning' for den oktetten som ble fjernet. Disse ip-adressene skrives så til en gitt fil.

 

Eksempel:

Scriptet får adressen 172.25.5.111. Så skriver scriptet ut alle adressene mellom

172.25.5.1 -> 172.25.5.254 til en fil (helst i stigende rekkefølge).

 

noen som klarer dette?

 

 

edit1: kunne sikkert laget dette selv i php men vil gjerne ha det i perl da det er mer integrert i linux.

Endret av ilpostino
Lenke til kommentar
Videoannonse
Annonse

selvsagt!

 

my ($ip) = shift || (`/sbin/ifconfig -a` =~ /inet addr:([\d\.]*)/)[0];
((my $netaddr) = $ip =~ /^(.*)\.\d*$/) || die "no IP found!";
print $netaddr,'.',++$i,"\n"  until $i == 254;

 

kjør:

"perl dette_programmet.pl" > din_fil.txt

for å lagre det i en fil. angi IP på kommandoinja ellers finner den maskinens ip selv.

 

edit: ikke vits å bruke Sys::HostIP til dette, som jeg først hadde.

Endret av Torbjørn
Lenke til kommentar
du er absolutt inne på noe her, men dette skriver ikke hele ip-adressen til filen, bare tallene 1 -> 254

Funker fett her.

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10
192.168.1.11
192.168.1.12
192.168.1.13
192.168.1.14
192.168.1.15
192.168.1.16
192.168.1.17
192.168.1.18
192.168.1.19
192.168.1.20
192.168.1.21
192.168.1.22
192.168.1.23
192.168.1.24
192.168.1.25
192.168.1.26
192.168.1.27
192.168.1.28
192.168.1.29
192.168.1.30
192.168.1.31
192.168.1.32
192.168.1.33
192.168.1.34
192.168.1.35
192.168.1.36
192.168.1.37
192.168.1.38
192.168.1.39
192.168.1.40
192.168.1.41
192.168.1.42
.
.
.

 

Siste linja sammenføyer jo $netadr med $i.

Lenke til kommentar

hvis du hadde kjørt "perl filnavn.pl" (som jeg faktisk skrev), hadde du ikke trengt she-bang (#!/usr/bin/perl) ;)

</hva-sa-jeg-mode>

 

Det kunne kanskje vært interessant å utvide skriptet til å hente reell nettmaske istedet for å anta at den er 255.255.255.0

 

på den annen side er det kanskje ikke så interessant å ha f.eks 65000 iper i en fil :p

Lenke til kommentar

nei, var det jeg også tenkte på. bør holde å forholde seg til 255 forskjellige hoster.

er det mye som eventuelt skal til for å få den til å sjekke ip-klasse/subnet-mask?

 

 

prøvde først å kjøre scriptet slik du sa, men da fikk jeg feilmelding mens jeg ikke fikk feilmelding når jeg slang på den extra linjen..... (av en eller annen grunn)

Lenke til kommentar

den linjen fortelle systemet hvilket program som skal kjøre skriptet. dette kalles for en såkalt "she-bang", og gjør at man kan ta et hvilket som helst skript og kjøre som ./filnavn.pl (kan være php, python, shell skript, hva som helst) så lenge første linje viser hvilket program som skal kjøre skriptet, eks: #!/usr/bin/perl, #!/usr/bin/python, #!/bin/bash, etc...

 

skriver du "which perl" på kommandolinja, vil du se at perl ligger i /usr/bin/perl

 

og for ordens skyld: hvis du fjerner #!/usr/bin/perl og kjører "perl filnavn.pl", så skal det fortsatt fungere, da kjører du bruker du perl til å kjøre programmet uansett hva som står øverst.

 

Angående netmask, det blir nok ikke så vanskelig.

 

vet ikke hvor klart det går fram, men dette programmet kjører systemkommandoen "/sbin/ifonfig" og sjekket resultatet av denne.

 

det betyr at hvis du kjører programmet på en windows maskin, så vil det ikke fungere!

(du spesifiserte imidlertid linux)

 

hvis du ser på output fra ifconfig, ser det slik ut (for meg):

lindahl@k-086124(~)$ /sbin/ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:01:02:A3:4F:08
         inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:78438637 errors:0 dropped:0 overruns:41 frame:0
         TX packets:51802947 errors:0 dropped:0 overruns:0 carrier:809
         collisions:0 txqueuelen:1000
         RX bytes:2956847829 (2819.8 Mb)  TX bytes:3183576482 (3036.0 Mb)
         Interrupt:11 Base address:0xdc00

eth1      Link encap:Ethernet  HWaddr 00:50:04:12:F1:C7
         inet addr:129.241.86.124  Bcast:129.241.87.255  Mask:255.255.254.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:146918210 errors:4 dropped:0 overruns:143 frame:4
         TX packets:142453061 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:3048577048 (2907.3 Mb)  TX bytes:2055241607 (1960.0 Mb)
         Interrupt:10 Base address:0xe000

lo        Link encap:Local Loopback
         inet addr:127.0.0.1  Mask:255.0.0.0
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:346460 errors:0 dropped:0 overruns:0 frame:0
         TX packets:346460 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:108633562 (103.6 Mb)  TX bytes:108633562 (103.6 Mb)

 

første forekomsten av strengen "inet addr:" blir brukt for å finne IP'en, i dette tilfellet 192.168.1.1. På samme linje står også netmask, og denne kan like enkelt hentes ut som ip.

 

problemet videre blir litt binær-matematikk, men burde være fullt overkommelig. Det blir riktig nok ikke så pent og pyntlig som den første løsningen.

 

Spør gjerne om du er interessert i å vite hvordan så lite programkode kan gjøre så mye :)

Lenke til kommentar

vet at nmap har ganske god funksjonalitet på å kartlegge diverse ting i et nettverk.... har for tiden fping til diverse utprøving om dagen....skal kaste meg over nmap ganske snart...lest endel dokumentasjon om programmet og det virker ganske bra.

 

tenkt til å bruke scriptet sammen med fping forresten.....

Lenke til kommentar

Holder på å sette meg inn i endel sikkerhets-verktøy for Linux om dagen. Har brukt endel Linux før og holder nå på å konvertere helt til Linux (Suse 9).

 

Går på et studie som heter "Digital sikkerhet og etteretning" som nettop tar for seg endel slike ting som fping og nmap,......

Lenke til kommentar

kjøpte en perl-bok for leeeeeenge siden men gadd aldri sette meg inn i det da jeg aldri helt fikk det til (i tilleg til at jeg kjørte Windows).

 

 

nå holder jeg på å bytte ut Windows med Linux og skal tørke støv av perl-boken og bruke det til å (mis)bruke linux skikkelig...

Lenke til kommentar

Her er en variant som henter ut reell bitmaske og skriver ut alle hoster på reelt subnett, den leser mao inn netmask.

 

#!/usr/bin/perl
use Socket;
my ($ip,$mask)=map {inet_aton($_)}(`/sbin/ifconfig -a`=~/inet addr:([\d\.]*).*Mask:([\d\.]*)/)[0,1];
my $i = unpack("N",($ip & $mask)); # startverdi - er også lik nettverksadressen
print inet_ntoa(pack("N",$i)),"\n" until ++$i == unpack("N",($ip & $mask)) + unpack("N",~$mask);

 

Ser kanskje litt kryptisk ut, må bruke Socketmodulen for å få tigang til et par sjekke funksjoner, inet_aton og inet_ntoa

 

edit: prøvde å unngå line breaks i koden.

Endret av Torbjørn
Lenke til kommentar
  • 2 år senere...

#!c:\perl\bin\perl.exe
# Denne virker på Windows
# Testet under ActiveState Perl versjon 5.8.8
use Socket;

# Sorry, prøvde meg på dette uten hell:
#    my $ip = inet_aton( (`ipconfig /all` =~ /IP Address(. )*: ([\d\.]*)/)[1] );
#    my $mask = inet_aton( (`ipconfig /all` =~ /Subnet Mask(. )*: ([\d\.]*)/)[1] );

my ($ip,$mask)=map {inet_aton($_)}(`ipconfig`=~/IP Address(. )*: ([\d\.]*).*Subnet Mask(. )*: ([\d\.]*)/)[1,3];

my $i = unpack("N",($ip & $mask)); # startverdi - er også lik nettverksadressen
print inet_ntoa(pack("N",$i)),"\n" until ++$i == unpack("N",($ip & $mask)) + unpack("N",~$mask);

 

Hvorfor fungerte ikke de linjene som jeg har kommenter ut over.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...