Jag har CSV-fil med IP-adresser och öppna portar:
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,,,,,
För varje IP-adress med en öppen port måste jag utföra ett kommando med både IP-adressen och portnumret för den öppna porten (hämtad från CSV-rubriken).
Kommentarer
- Kommer kommandot som du utför för varje IP med öppna portar att använda motsvarande portnummer? Är portnumret numret som anges i CSV-rubriken?
- @Kusalananda exakt !!
- och tack för att du hjälpte mig att redigera min fråga @Kusalananda och du förstod min fråga,
- Jag ' Jag förmedlar just denna fråga, tack; men om jag skulle svara skulle jag vilja veta vilket kommando du ' kör igen, så att det ' klargör hur porten bör porträtteras. Jag tror att ' d gör svaret mer användbart för dig. Jag ' Jag är också nyfiken om antalet möjliga portar slutar vid 26 eller kan gå upp till 65 535? Skulle det bara någonsin finnas en öppen port? Kan det finnas noll eller fler än en?
- @JeffSchaller-kommandot är telnet och portnumret är inte upp till 65.535 men jag har mer än 900 portar och status kommer att ändras varje gång med skanningen. vad jag vill uppnå är att kontrollera om det finns någon aktiv telnet-session som lyssnar men jag behöver bara hjälp med att välja IP och portnummer som är öppet
Svar
Att lösa detta kompetent i ren bash
skulle, tror jag, inte vara tillrådligt. Se t.ex. frågan ” Varför är att använda en skalslinga för att bearbeta text som dålig praxis? ”.
Låt oss istället göra inmatningsdata lite lättare att smälta.
awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv
Detta awk
-kommando läser först portnumren från första raden i CSV-filen i en matris med namnet port
. Portnumret för kolumn N
lagras i port[N]
.
Det görs genom att dela upp den första raden i inmatningen på kommatecken och helt enkelt spara resultatet i port
-matrisen. Detta är vad split()
-kommandot gör. Villkoret FNR == 1
betyder ”Om det här är den första raden i filen, gör så …” (FNR
är radnumret i den aktuella inmatningsfilen). Ett kodblock utan villkor på det kommer att köras för varje ingångsrad.
Efter att ha ringt split()
, , fältseparatorn, är inställd på ett kommatecken. Detta innebär att de andra raderna i filen automatiskt delas i kommatecken i fält. Detta används i slingan i det andra blocket för att slinga över CSV-fälten (från det andra fältet till det sista) på varje rad.
För var och en av de andra raderna i datan slingrar den genom kommaseparerade fält, och när den hittar ett fält vars värde är strängen open
, det skriver ut IP-adressen (det första fältet) och motsvarande portnummer.
Utgången från detta kommando, med tanke på att uppgifterna i frågan är
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
Detta kan enkelt läsas av en slinga i skalet:
while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done
Detta läser IP-adressen och portnumret, en efter en.
För att kombinera dessa i ett komplett skript:
#!/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
Utdata från awk
kommandot rörs till while
-slingan som läser värdena och anropar kommandot (notera |
-röret efter inmatningsfilnamnet).
Observera att om en IP-adress har mer än en port öppen kommer kommandot att köras flera gånger för den adressen.
Kommentarer
- OMG detta var vad jag var tr ying att göra, det här är fantastiskt. Jag är dum Kan du snälla hjälpa mig att förstå detta mer (kan du berätta för mig i felsökningsläge?)
- @biniyamgetu Jag behöver veta exakt vad jag behöver förklara.
- Bro I är verkligen tacksam, det här är så hjälpsamt … så, vad gör FNR == 1, då ser jag splittring och vad är FS
- @biniyamgetu Vänta, jag lägger till lite extra text om dessa saker .
- du är geni, och det gör det jag ville göra … Tack herr !!
Svar
Välj ditt första och nästa respektive fält med awk
.
awk -d "," -F "{print $1, $n...}
Kommentarer
- Detta
t adresserar ännu inte att utföra ett kommando eller använda portarna. För framtiden, när frågor genomgår kraftiga kommentarer och redigeringar, föreslår jag ' att vänta på att kraven ska sättas ner innan du försöker svara.