Mám soubor CSV s adresami IP a otevřenými porty:
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,,,,,
Pro každou adresu IP s otevřeným portem musím provést příkaz pomocí adresy IP i čísla portu otevřeného portu (převzato z hlavičky CSV).
Komentáře
- Bude muset příkaz, který provedete pro každou IP s otevřenými porty, používat odpovídající číslo portu? Je číslo portu číslo uvedené v záhlaví CSV?
- @Kusalananda přesně !!
- a děkuji, že jste mi pomohli upravit moji otázku @Kusalananda a rozuměli jste mé otázce,
- Já ' předám tuto konkrétní otázku, děkuji; ale kdybych měl odpovědět, chtěl bych vědět, jaký příkaz ' znovu provádíte, aby ' jasně ukázal, jak port by měl být zobrazen. Myslím, že díky ' d je pro vás odpověď užitečnější. Byl bych také ' zvědavý, jestli počet možných portů končí na 26 nebo by mohl dosáhnout až 65 535? Také by někdy existoval pouze jeden otevřený port? Může být nula nebo více než jeden?
- Příkaz @JeffSchaller je telnet a číslo portu není až 65 535, ale mám více než 900 portů a stav se při skenování pokaždé změní. čeho chci dosáhnout, je zkontrolovat, zda existuje nějaká aktivní relace telnetu, ale potřebuji pomoc s výběrem IP a čísla portu, která je otevřená
odpověď
Řešení tohoto konkurenceschopného čistého bash
by, myslím, nebylo vhodné. Viz např. otázka „ Proč je použití smyčky prostředí ke zpracování textu považováno za nevhodný postup? „.
Místo toho nechme vstupní data vytvořit trochu snazší strávit.
awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv
Tento příkaz awk
nejprve načte čísla portů z prvního řádku soubor CSV do pole s názvem port
. Číslo portu pro sloupec N
by bylo uloženo v port[N]
.
Dělá to tak, že první řádek vstupu rozdělí na čárky a výsledek jednoduše uloží do pole port
. To je split()
příkaz ano. Podmínka FNR == 1
znamená „Pokud se jedná o první řádek souboru, udělejte to …“ (FNR
je číslo řádku v aktuálním vstupním souboru). Pro každý řádek vstupu bude spuštěn blok kódu bez podmínek.
Po volání split()
, , oddělovač polí, je nastaven na čárku. To znamená, že ostatní řádky v souboru budou automaticky rozděleny čárkami na pole. To se používá ve smyčce ve druhém bloku k smyčce přes pole CSV (od druhého pole k poslednímu) na každém řádku.
U každého z ostatních řádků v datech prochází políčky oddělenými čárkami a když najde pole, jehož hodnotou je řetězec open
, vytiskne IP adresu (první pole) a odpovídající číslo portu.
Výstup z tohoto příkazu, vzhledem k údajům v otázce, je
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
Toto lze snadno přečíst smyčkou v shellu:
while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done
Tím se přečte jedna po druhé IP adresa a číslo portu.
Chcete-li je zkombinovat do úplného skriptu:
#!/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
Výstup awk
příkaz je pipetován do while
smyčky, která čte hodnoty a volá příkaz (všimněte si |
kanálu za vstupním názvem souboru).
Upozorňujeme, že pokud má adresa IP otevřený více než jeden port, příkaz bude pro tuto adresu spuštěn několikrát.
Komentáře
- OMG to bylo to, co jsem byl tr dělat, to je úžasné. Jsem hloupý Můžete mi prosím pomoci, abych tomu více porozuměl (můžete mi to říct v režimu ladění?)
- @biniyamgetu Potřebuji přesně vědět, co musím vysvětlit.
- Bro I jsem opravdu vděčný, je to tak užitečné … takže, co dělá FNR == 1, pak vidím split a co je FS
- @biniyamgetu Hold on, přidám nějaký text navíc o těchto věcech .
- jste geniální a děláte to, co jsem chtěl dělat … děkuji, pane !!
odpověď
Pomocí awk
vyberte své první a další příslušné pole.
awk -d "," -F "{print $1, $n...}
Komentáře
- Toto ještě ' nereflektuje provádění příkazu ani použití portů. Do budoucna, když budou otázky procházet těžkými komentáři a úpravami, navrhuji ' d počkat, než se požadavky usadí, než se pokusíme odpovědět.