IP-címmel és nyitott portokkal rendelkező CSV-fájlommal rendelkezem:
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,,,,,
Minden nyitott porttal rendelkező IP-címhez egy parancsot kell végrehajtanom, mind az IP-cím, mind a nyitott port portszámának felhasználásával (a CSV fejlécéből).
Megjegyzések
- A nyitott portokkal rendelkező IP-k számára végrehajtott parancsnak a megfelelő portszámot kell használnia? A portszám a CSV fejlécében felsorolt szám?
- Pontosan @Kusalananda !!
- és köszönöm, hogy segítettetek szerkeszteni a kérdésemet @Kusalananda, és megértettétek a kérdésemet,
- Én ' továbbadom ezt a bizonyos kérdést, köszönöm; de ha válaszolnék, szeretném tudni, hogy melyik parancsot hajtja végre ', hogy ' egyértelművé tegye a port ábrázolni kell. Úgy gondolom, hogy ' d a választ sokkal hasznosabbá teszi számodra. <
kíváncsi lennék arra is, ha a lehetséges portok száma 26-ra végződik, vagy akár 65 535-re is felmehet? Ezenkívül csak egy nyitott port lehet? Lehet, hogy nulla vagy egynél több?
Válasz
Ennek versenyképes megoldása tiszta bash
-ben szerintem nem lenne tanácsos. Lásd pl. a “ kérdés miért minősül rossz gyakorlatnak a shell feldolgozása a szöveg feldolgozásának? “.
Ehelyett adjuk meg a bemeneti adatokat egy kicsit könnyebben emészthető.
awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv
Ez a awk
parancs először beolvassa a portszámokat a a CSV-fájlt egy port
nevű tömbbe. A N
oszlop portszámát a port[N]
.
Ezt úgy teszi meg, hogy a bemenet első sorát vesszőkre osztja, és az eredményt egyszerűen az port
tömbben tárolja. Ezt a split()
parancs megteszi. A FNR == 1
feltétel azt jelenti: “Ha ez a fájl első sora, akkor tegye ezt …” (FNR
az aktuális bemeneti fájl sorszáma.) Minden bemenetsorhoz végrehajtunk egy kódblokkot, amelyen nincs feltétel.
A split()
, mezőelválasztó vesszőre van állítva. Ez azt jelenti, hogy a fájl többi sora vesszőkből automatikusan mezőkre lesz osztva. Ezt a második blokk hurokjában használják az egyes sorok CSV-mezőinek (a második mezőtől az utolsóig) áthúzására.
Az adatok többi sorában a vesszővel elválasztott mezőkön körbevezet, és amikor olyan mezőt talál, amelynek értéke a open
karakterlánc, kinyomtatja az IP-címet (az első mezőt) és a hozzá tartozó portszámot.
Ennek a parancsnak a kimenete, a kérdés adatait tekintve
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
Ezt könnyen leolvashatja a héjban lévő hurok:
while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done
Ez egyesével olvassa az IP-címet és a portszámot.
Ezeknek a teljes szkriptjévé történő összeállítása:
#!/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
A awk
parancs átkerül a while
ciklusba, amely beolvassa az értékeket és meghívja a parancsot (vegye figyelembe a |
csövet a bemeneti fájlnév után).
Ne feledje, hogy ha egy IP-címnek egynél több portja van nyitva, akkor a parancs többször is végrehajtásra kerül az adott címhez.
Megjegyzések
- OMG ez volt az, ami tr voltam csinálni, ez csodálatos. Buta vagyok. Kérem, segítsen nekem, hogy ezt jobban megértsem (tudna nekem hibakeresési módban mondani?)
- @biniyamgetu Pontosan tudnom kell, hogy mit kell elmagyaráznom.
- Bro I nagyon hálás vagyok, ez nagyon hasznos … szóval, mit csinál az FNR == 1, akkor látom, hogy kettészakadt, és mi az FS
- @biniyamgetu Kapaszkodj meg, adok néhány extra szöveget ezekről a dolgokról .
- zseniális vagy, és azt csinálja, amit szerettem volna … Köszönöm, uram !!
Válasz
Válassza ki az első és a következő megfelelő mezőt a awk
gombbal.
awk -d "," -F "{print $1, $n...}
Megjegyzések
- Ez nem ' még nem parancsot végrehajtó vagy a portokat használó cím. A jövőben, amikor a kérdéseket erősen kommentálják és szerkesztik, ' azt javaslom, hogy a válasz megkísérlése előtt várjon a követelmények rendezésére.