Mam plik CSV z adresami IP i otwartymi portami:
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,,,,,
Dla każdego adresu IP z otwartym portem muszę wykonać polecenie, używając zarówno adresu IP, jak i numeru portu otwartego portu (pobranego z nagłówka CSV).
Komentarze
- Czy polecenie wykonywane dla każdego adresu IP z otwartymi portami będzie musiało używać odpowiedniego numeru portu? Czy numer portu to numer podany w nagłówku CSV?
- @Kusalananda dokładnie !!
- i dziękuję za pomoc w edycji mojego pytania @Kusalananda i zrozumiałeś moje pytanie,
- I ' przekażę to konkretne pytanie, dziękuję; ale gdybym miał odpowiedzieć, chciałbym wiedzieć, jakie polecenie ' ponownie wykonujesz, aby ' było jasne, jak port powinny być przedstawiane. Myślę, że ' d sprawi, że ta odpowiedź będzie dla Ciebie bardziej użyteczna. ' c. Ciekawe, czy liczba możliwych portów kończy się na 26, czy może wzrosnąć do 65 535? Poza tym, czy byłby kiedykolwiek tylko jeden otwarty port? Czy może być zero lub więcej niż jeden?
- @JeffSchaller Polecenie to telnet, a numer portu nie jest do 65 535, ale mam ponad 900 portów i stan będzie się zmieniał za każdym razem podczas skanowania. co chcę osiągnąć to sprawdzić, czy jest jakaś aktywna sesja nasłuchiwania telnet, ale potrzebuję tylko pomocy w wyborze adresu IP i numeru portu, który jest otwarty
Odpowiedź
Rozwiązanie tego kompetentnie w czystym bash
nie byłoby, moim zdaniem, wskazane. Zobacz np. pytanie „ Dlaczego używanie pętli powłoki do przetwarzania tekstu jest uważane za złą praktykę? ”.
Zamiast tego zróbmy dane wejściowe nieco łatwiejsze do zrozumienia.
awk "FNR == 1 { split($0, port, ","); FS=","; next } { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }" file.csv
To awk
polecenie najpierw odczytuje numery portów z pierwszego wiersza plik CSV do tablicy o nazwie port
. Numer portu w kolumnie N
byłby przechowywany w port[N]
.
Odbywa się to poprzez podzielenie pierwszego wiersza danych wejściowych przecinkami i po prostu zapisanie wyniku w tablicy port
. Oto, co split()
tak. Warunek FNR == 1
oznacza „Jeśli to jest pierwsza linia pliku, zrób to …” (FNR
to numer linii w bieżącym pliku wejściowym). Blok kodu bez warunku zostanie wykonany dla każdej linii wejścia.
Po wywołaniu split()
, , separator pól, jest ustawiony na przecinek. Oznacza to, że pozostałe wiersze w pliku zostaną automatycznie podzielone przecinkami na pola. Jest to używane w pętli w drugim bloku, aby zapętlić pola CSV (od drugiego pola do ostatniego) w każdym wierszu.
Dla każdego z pozostałych wierszy w danych przechodzi przez pola rozdzielane przecinkami, a gdy znajduje pole, którego wartością jest ciąg open
, wypisuje adres IP (pierwsze pole) i odpowiedni numer portu.
Dane wyjściowe tego polecenia, biorąc pod uwagę dane w pytaniu, to
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
Można to łatwo odczytać za pomocą pętli w powłoce:
while read -r ip port; do telnet "$ip" "$port" # or whatever your command is done
Odczytuje adres IP i numer portu, jeden po drugim.
Aby połączyć je w kompletny skrypt:
#!/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
Dane wyjściowe awk
polecenie jest przesyłane potokiem do pętli while
, która odczytuje wartości i wywołuje polecenie (zwróć uwagę na potok |
po nazwie pliku wejściowego).
Należy pamiętać, że jeśli adres IP ma więcej niż jeden otwarty port, polecenie zostanie wykonane wiele razy dla tego adresu.
Komentarze
- OMG to było to, czym byłem tr jeśli chcesz to zrobić, to jest niesamowite. Jestem głupi Czy możesz mi pomóc lepiej to zrozumieć (czy możesz mi powiedzieć w trybie debugowania?)
- @biniyamgetu Muszę dokładnie wiedzieć, co muszę wyjaśnić.
- Bracie jestem naprawdę wdzięczny, to jest bardzo pomocne … więc co robi FNR == 1, wtedy widzę split i co to jest FS
- @biniyamgetu Zaczekaj, dodam trochę tekstu o tych rzeczach .
- jesteś geniuszem i robi to, co chciałem … Dziękuję panie!
Odpowiedź
Wybierz pierwsze i następne odpowiednie pola za pomocą awk
.
awk -d "," -F "{print $1, $n...}
Komentarze
- Nie ' jeszcze nie adresuje wykonywania polecenia lub korzystania z portów. Na przyszłość, kiedy pytania są intensywnie komentowane i edytowane, ' d sugeruję zaczekanie na ustalenie wymagań przed podjęciem próby udzielenia odpowiedzi.