Jak ze skryptu bash mogę szybko dowiedzieć się, czy port 445
jest otwarty / nasłuchuje na serwerze.
Wypróbowałem kilka opcji, ale chcę czegoś szybkiego:
1. lsof -i :445
(Zajmuje sekundy)
2. netstat -an |grep 445 |grep LISTEN
(Zajmuje sekundy)
3. telnet
(Nie zwraca)
4. nmap
, netcat
Nie są dostępne na serwerze
Miło będzie wiedzieć o sposobie, który nie wylicza najpierw, a potem greps.
netstat -lnt
(zi-t
bez-a
) ograniczy wyjście tylko do nasłuchiwania połączeń TCP. Może trochę przyspieszyć. Możesz dodać-4
dla IPv4 tylko wtedy, gdy nie potrzebujesz IPv6.netstat -an | grep PORTNUMBER | grep -i listen
Jeśli dane wyjściowe są puste, port nie jest używany.lsof
jest dla ciebie powolny, ale zwykle jest to najlepsze z wymienionych rozwiązań. Twojenetstat
rozwiązanie nie jest zbyt niezawodne (możesz zgadywać za każdym razem, gdy go używaszgrep
; w każdym razie zwraca wartość prawda, jeśli ktoś słucha np. 4450).telnet
inetcat
faktycznie próbujemy utworzyć połączenie, które nie zawsze jest tym, czego chcesz.Odpowiedzi:
Niespodzianką, którą ostatnio odkryłem, jest to, że Bash natywnie obsługuje połączenia TCP jako deskryptory plików . Używać:
Używam 6 jako deskryptora pliku, ponieważ 0,1,2 to stdin, stdout i stderr. 5 jest czasem używane przez Bash do procesów potomnych , więc 3,4,6,7,8 i 9 powinny być bezpieczne.
Zgodnie z komentarzem poniżej, aby przetestować nasłuchiwanie na serwerze lokalnym w skrypcie:
Aby ustalić, czy ktoś nasłuchuje, spróbuj połączyć się przez sprzężenie zwrotne. Jeśli to się nie powiedzie, port jest zamknięty lub nie mamy dostępu. Następnie zamknij połączenie.
Zmodyfikuj to dla swojego przypadku użycia, na przykład wysyłając wiadomość e-mail, wychodząc ze skryptu w przypadku awarii lub uruchamiając wymaganą usługę.
źródło
/dev/tcp/IP/PORT
drzewa„Krótka odpowiedź” jest tutaj bardzo krótka: Jak sprawdzić, czy zdalny port TCP jest otwarty ze skryptu Shell?
Używam go z 127.0.0.1 jako „zdalny” adres.
zwraca to „0”, jeśli port jest otwarty, i „1”, jeśli port jest zamknięty
na przykład
źródło
Możesz użyć netstat w ten sposób, aby uzyskać znacznie szybsze wyniki:
W systemie Linux:
Na komputerze Mac:
Spowoduje to wyświetlenie listy procesów nasłuchujących na porcie (445 w tym przykładzie) lub nie wyprowadzi niczego, jeśli port będzie wolny.
źródło
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
awk '$6 == "LISTEN" && $4 ~ "80$"'
. Zamiast sprawdzać kropkę przed numerem portu\.80
, użyłem80$
. W przeciwnym razie, to również pasowało do adresów IP zawierających.80
i portów zaczynających się od80
takich jak8000
.Możesz do tego użyć netcat.
łączy się z serwerem i ponownie bezpośrednio zamyka połączenie. Jeśli netcat nie może się połączyć, zwraca niezerowy kod wyjścia. Kod wyjścia jest przechowywany w zmiennej $ ?. Jako przykład,
zwróci 0 wtedy i tylko wtedy, gdy netcat może pomyślnie połączyć się z portem.
źródło
nc
ma w-z
tym celu flagę, która nie wymaga pobierania danych wejściowych/dev/null
. Odpowiedź już jest za pomocą-z
powyższej flagi.Na podstawie odpowiedzi Spencera Rathbuna, używając bash:
źródło
: &>/dev/null </dev/tcp/127.0.0.1/$PORT
są wymienione w / proc / net / tcp.
jest to druga kolumna, po „:”, szesnastkowo:
więc chyba jedna z tych
:50
w trzeciej kolumnie musi być nakładaniem stosu: o)poszukaj
man 5 proc
więcej szczegółów. i wybieranie tego osobno za pomocą sed itp. jest ćwiczeniem dla delikatnego czytelnika ...źródło
2ms jest wystarczająco szybki?
Dodaj dwukropek, a to działa w systemie Linux
źródło
ss
jest nawet odrobinę szybszy niżnc
.l
jest do słuchania ,4
jest dla IPv4;sport
oznacza (oczywiście) port źródłowy . Powyższe polecenie zakłada nasłuchiwanie portu TCP (t
opcja): użyju
opcji dla UDP lub żadnego z nich dla obu protokołów. Więcej informacji nass
temat Nixcraft jak zawsze . UWAGA:ss
filtry tutaj nie działają, nie wiem dlaczego (bash 4.3.11, narzędzie ss, iproute2-ss131122), muszą iść z grep .ss
polecenie nie zwraca kodu wyjścia odzwierciedlającego jego znalezienie; zawsze zwraca 0 kod wyjścia.| grep LISTEN
?State Recv-Q Send-Q Local Address:Port Peer Address:Port
i teraz? Co to znaczy?Oto jeden, który działa zarówno na Macu, jak i Linuksie:
źródło
[\\.\:]
.Gdzie 8000 to numer portu. Jeśli port jest wolny, uruchomi serwer, który można łatwo zamknąć. Jeśli nie, zgłosi błąd:
źródło
Chciałem sprawdzić, czy port jest otwarty na jednym z naszych testowych serwerów linuxowych. Byłem w stanie to zrobić, próbując połączyć się z telnetem z mojej maszyny deweloperskiej do serwera testowego. Na komputerze dewelopera spróbuj uruchomić:
W tym przykładzie chcę sprawdzić, czy port 8080 jest otwarty na hoście test2.host.com
źródło
tcping to świetne narzędzie z bardzo niskim narzutem, a także posiada argument limitu czasu, aby przyspieszyć:
źródło
Możesz także użyć polecenia netcat
lub
-z - ustawia nc, aby po prostu skanował w poszukiwaniu demonów nasłuchujących, bez wysyłania do nich żadnych danych.
-v - włącza pełny tryb.
źródło
nmap
jest właściwym narzędziem. Po prostu użyjnmap example.com -p 80
Możesz go użyć z lokalnego lub zdalnego serwera. Pomaga także określić, czy zapora blokuje dostęp.
źródło
Jeśli używasz iptables, spróbuj:
lub
źródło