Minulla on CSV-tiedosto, jossa on IP-osoitteet ja avoimet portit:
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,,,,,
Jokaiselle avoimen portin sisältävälle IP-osoitteelle minun on suoritettava komento käyttämällä sekä IP-osoitetta että avoimen portin porttinumeroa (otettu CSV-otsikosta).
Kommentit
- Pitääkö komennon, jonka teet jokaiselle avoimen portin IP-osoitteelle, vastaavan portin numeron? Onko porttinumero CSV-otsikossa mainittu numero?
- @Kusalananda täsmälleen !!
- ja kiitos, että autat minua muokkaamaan kysymystäni @Kusalananda, ja ymmärrät kysymykseni,
- I ' välitän tämän kysymyksen, kiitos; mutta jos vastaisin, haluaisin tietää, minkä komennon ' suoritat uudelleen, jotta se ' selvittää kuinka portti tulisi kuvata. Luulen, että ' d tekee vastauksesta hyödyllisemmän sinulle. Olen ' myös utelias, jos mahdollisten porttien määrä päättyy 26: een tai voi nousta 65535: een? Lisäksi olisiko koskaan vain yksi avoin portti? Voisiko olla nolla tai useampi kuin yksi?
- @JeffSchaller -komento on telnet ja porttinumero ei ole enempää kuin 65535, mutta minulla on yli 900 porttia ja tila muuttuu joka kerta skannauksen yhteydessä. Haluan saavuttaa tarkistamalla, onko aktiivista telnet-istunnon kuuntelua, mutta tarvitsen vain apua valitessasi avointa IP-osoitetta ja porttinumeroa
Vastaa
Tämän kilpailun ratkaiseminen puhtaana bash
ei mielestäni ole suositeltavaa. Katso esim. kysymys ” Miksi kuorisilmukan käyttöä tekstin käsittelemiseksi pidetään huonona käytäntönä? ”.
Anna sen sijaan antaa syötetiedot hieman helpommin sulava.
awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv
Tämä komento awk
lukisi ensin porttinumerot CSV-tiedosto taulukoksi nimeltä port
. Sarakkeen N
porttinumero tallennettaisiin kansioon port[N]
.
Se tekee tämän jakamalla syötteen ensimmäisen rivin pilkkuihin ja yksinkertaisesti tallentamalla tuloksen port
-taulukkoon. Tätä split()
-komento tekee. Ehto FNR == 1
tarkoittaa ”Jos tämä on tiedoston ensimmäinen rivi, tee tämä …” (FNR
on nykyisen syötetiedoston rivinumero.) Kullekin syöteriville suoritetaan koodilohko, jolla ei ole ehtoja.
Kun olet kutsunut split()
, , kentän erotin, asetetaan pilkuksi. Tämä tarkoittaa, että tiedoston muut rivit jaetaan pilkuissa automaattisesti kenttiin. Tätä käytetään toisen lohkon silmukassa silmukkaamaan jokaisen rivin CSV-kentät (toisesta kentästä viimeiseen).
Jokaisella muulla datan rivillä se silmukkaa pilkulla erotettujen kenttien läpi ja kun se löytää kentän, jonka arvo on merkkijono open
, se tulostaa IP-osoitteen (ensimmäisen kentän) ja vastaavan portin numeron.
Tämän komennon lähtö, kun kysymyksessä olevat tiedot ovat
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
Tämän voi helposti lukea kuoren silmukalla:
while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done
Tämä lukee IP-osoitteen ja portin numeron yksi kerrallaan.
Näiden yhdistäminen täydelliseksi komentotiedostoksi:
#!/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
awk
komento johdetaan while
-silmukkaan, joka lukee arvot ja kutsuu komennon (huomioi |
-putki syötetyn tiedostonimen jälkeen).
Huomaa, että jos IP-osoitteessa on useita portteja auki, komento suoritetaan useita kertoja kyseiselle osoitteelle.
Kommentit
- OMG tämä oli mitä minä olin tr Se on hämmästyttävää. Olen tyhmä Voitteko auttaa minua ymmärtämään tätä enemmän (voitko kertoa minulle virheenkorjaustilassa?)
- @biniyamgetu Minun on tiedettävä tarkalleen mitä minun on selitettävä.
- Bro I olen todella kiitollinen, tämä on niin hyödyllistä … joten mitä FNR == 1 tekee, niin näen jakautumisen ja mikä on FS
- @biniyamgetu Pidä kiinni, lisätään ylimääräistä tekstiä näistä asioista .
- olet nero, ja se tekee mitä halusin tehdä … Kiitos herra !!
Vastaa
Valitse ensimmäinen ja seuraava vastaava kenttä käyttämällä awk
.
awk -d "," -F "{print $1, $n...}
Kommentit
- Tämä ei ' t vielä osoita komentoa tai käyttää portteja. Jatkossa, kun kysymyksiä kommentoidaan ja muokataan kovasti, ehdotan ' ehdotan odottavan vaatimusten täyttymistä ennen vastauksen yrittämistä.