Jeg har CSV-fil med IP-adresser og åbne porte:
IP,1,3,4,6,7,9,13,17,19,20,21,22,23,24,25,26 1.1.1.2,,,,,,,,,,,open,,,,, 1.1.1.3,,,,,,,,,,,open,,,,, 1.1.1.4,,open ,open,,,,,,,,open,,,,, 1.1.1.5,,,,,,,,,,,open,,,,, 1.2.3.4,,,,,,,,,,,open,,,,, 1.4.5.6,,,,,open,,,,,,open,,,,, 1.4.5.6,,,,,,,,,,,open,,,,, 1.1.3.4,,,,,,,,,,,open,,,,,
For hver IP-adresse med en åben port skal jeg udføre en kommando ved hjælp af både IP-adressen og portnummeret på den åbne port (taget fra CSV-overskriften).
Kommentarer
- Vil den kommando, du udfører for hver IP med åbne porte, bruge det tilsvarende portnummer? Er portnummeret det nummer, der er anført i CSV-overskriften?
- @Kusalananda nøjagtigt !!
- og tak for at hjælpe mig med at redigere mit spørgsmål @Kusalananda, og du forstod mit spørgsmål,
- Jeg ' Jeg videregiver netop dette spørgsmål, tak; men hvis jeg skulle svare, ville jeg gerne vide, hvilken kommando du ' genudfører, så det ' er klart, hvordan porten skal portrætteres. Jeg tror, at ' d gør svaret mere nyttigt for dig. Jeg ' ville jeg også være nysgerrig, om antallet af mulige porte ender ved 26 eller kan gå op til 65.535? Ville der kun nogensinde være en åben port? Kunne der være nul eller mere end en?
- @JeffSchaller-kommandoen er telnet, og portnummeret er ikke op til 65.535, men jeg har mere end 900 porte, og status vil ændre sig hver gang med scanningen. hvad jeg vil opnå er at kontrollere, om der er nogen aktiv telnet-session, der lytter, men jeg har bare brug for hjælp til at vælge IP og portnummer, der er åbent
Svar
At løse dette kompetent i ren bash
ville, tror jeg, ikke være tilrådeligt. Se f.eks. spørgsmålet “ Hvorfor betragtes det som dårlig praksis at bruge en shell-loop til at behandle tekst? “.
Lad os i stedet gøre inputdataene lidt lettere at fordøje.
awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv
Denne awk
-kommando læser først portnumrene fra den første linje i CSV-filen i et array kaldet port
. Portnummeret for kolonne N
lagres i port[N]
.
Det gøres ved at opdele inputens første linje i kommaer og blot gemme resultatet i port
-arrayet. Dette er hvad split()
kommando gør. Betingelsen FNR == 1
betyder “Hvis dette er den første linje i filen, skal du gøre dette …” (FNR
er linienummeret i den aktuelle inputfil). En kodeblok uden betingelse for den vil blive udført for hver linie med input.
Efter at have ringet til split()
, , feltadskilleren, er indstillet til et komma. Dette betyder, at de andre linjer i filen automatisk opdeles i kommaer i felter. Dette bruges i loop i den anden blok til at loop over CSV-felterne (fra det andet felt til det sidste) på hver linje.
For hver af de andre rækker i dataene løber den gennem de kommaafgrænsede felter, og når den finder et felt, hvis værdi er strengen open
, det udskriver IP-adressen (det første felt) og det tilsvarende portnummer.
Outputtet fra denne kommando, givet dataene i spørgsmålet, er
1.1.1.2 21 1.1.1.3 21 1.1.1.4 4 1.1.1.4 21 1.1.1.5 21 1.2.3.4 21 1.4.5.6 7 1.4.5.6 21 1.4.5.6 21 1.1.3.4 21
Dette kan let læses af en sløjfe i skallen:
while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done
Dette læser IP-adressen og portnummeret en efter en.
Sådan kombineres disse i et komplet script:
#!/bin/sh awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv | while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done
Output af awk
kommandoen ledes til while
-sløjfen, der læser værdierne og kalder kommandoen (bemærk |
-røret efter inputfilnavnet).
Bemærk, at hvis en IP-adresse har mere end en port åben, udføres kommandoen flere gange for den adresse.
Kommentarer
- OMG dette var hvad jeg var tr ying at gøre, dette er fantastisk. Jeg er dum Kan du venligst hjælpe mig med at forstå dette mere (kan du fortælle mig i fejlretningstilstand?)
- @biniyamgetu Jeg har brug for at vide nøjagtigt, hvad jeg har brug for at forklare.
- Bro I er virkelig taknemmelig, dette er så nyttigt … så, hvad laver FNR == 1, så ser jeg split og hvad er FS
- @biniyamgetu Vent, jeg vil tilføje lidt ekstra tekst om disse ting .
- du er geni, og det gør, hvad jeg ville gøre … Tak sir !!
Svar
Vælg dit første og næste respektive felt ved hjælp af awk
.
awk -d "," -F "{print $1, $n...}
Kommentarer
- Dette betyder ikke ' t endnu adresse på udførelse af en kommando eller ved hjælp af porte. For fremtiden, når spørgsmål gennemgår tunge kommentarer og redigering, foreslår jeg ' d at vente på, at kravene skal slå sig ned, før du prøver et svar.