Sprawdź stan jednego portu na zdalnym hoście [zamknięty]

158

Potrzebuję wiersza poleceń, który może sprawdzić stan portu na zdalnym hoście. Próbowałem, ping xxx.xxx.xxx.xxx:161ale nie rozpoznaje „hosta”. Myślałem, że to „dobra” odpowiedź, dopóki nie wykonałem tego samego polecenia przeciwko hostowi, o którym wiem, że ten port jest otwarty. Dotyczy to pliku wsadowego w systemie Windows, który sprawdzi stan zdalnego portu, a następnie uruchomi polecenie wykorzystujące ten zdalny port do informacji, następnie ponownie polecenie zdalnego sprawdzania portu, a następnie polecenie używające tego portu na następnym serwerze w celu uzyskania informacji , i tak dalej. Szukałem wszędzie i pomyślałem, że ping może to zrobić, ale muszą istnieć różne wersje pinga, przypuszczam, że ponieważ serwer, na którym to robię, nie pokazuje tej opcji.

Dla chichotów wypróbowałem zdalny program do sprawdzania portów z poziomu witryny internetowej - i wyniki były poprawne zarówno dla serwera „problemowego”, jak i dla właściwego serwera. Jednak nie mogę tego użyć w trybie wsadowym z ponad 500 adresami IP serwerów.

Czy jest coś, co mogę zrobić, co jest proste? Moje umiejętności Perla są bardzo zardzewiałe (używaj go lub strać), nie znam żadnych innych języków opartych na systemie Windows poza wsadowymi. Unix to moja umiejętność, ale to musi być wykonane z Widows Server 2003.

Ross Ridge
źródło
5
Możesz zapytać o to na serverfault.com
John Rasch
1
Ponieważ to pytanie jest zamknięte, odpowiedziałem tutaj
npocmaka
windows ps> tnc xxx.xxx.xxx.xxx -port 161
Moslem Shahsavan

Odpowiedzi:

151

Wygląda na to, że szukasz skanera portów, takiego jak nmap lub netcat , z których oba są dostępne dla systemów Windows, Linux i Mac OS X.

Na przykład sprawdź telnet na znanym adresie IP:

nmap -A 192.168.0.5/32 -p 23

Na przykład poszukaj otwartych portów od 20 do 30 w witrynie host.example.com:

nc -z host.example.com 20-30
Glenn
źródło
Oba są dostępne dla systemu Windows.
Glenn,
1
twoja komenda nmap powinna prawdziwie "-p23" bez spacji. nmap traktuje każdą jednostkę, która nie jest bezpośrednio poprzedzona flagą, jako osobne miejsce docelowe skanowania
Brandon Lebedev
14
powinno być nc -zv host.example.com 20-30. inaczej nie ma wyjścia
Aryeh Beitz
1
Opcja -zdla ncnie jest dostępna w systemie Linux.
valentin_nasta
1
@valentin_nasta tak, być może w zależności od używanej wersji netcata (gnu lub openbsd). Oto odpowiednia linia ze strony podręcznika dla nc (wersja openbsd) w moim systemie Arch linux: -z Określa, że ​​nc powinien skanować w poszukiwaniu demonów nasłuchujących, bez wysyłania do nich żadnych danych. Błędem jest używanie tej opcji w połączeniu z opcją -l
pgoetz
126

W wierszu polecenia możesz użyć polecenia telnet .. Na przykład, aby połączyć się z adresem IP 192.168.10.1 z portem 80,

telnet 192.168.10.1 80

Aby włączyć telnet w Windows 7 i nowszych, kliknij . Z połączonego artykułu włącz telnet za pomocą panelu sterowania -> programy i funkcje -> funkcje systemu Windows -> klient telnet lub po prostu uruchom to w monicie administratora:

dism /online /Enable-Feature /FeatureName:TelnetClient
Naveen Yedugani
źródło
3
Jest to najłatwiejsza metoda, jeśli telnet jest zainstalowany na urządzeniu z systemem Windows
shonky użytkownik linuxa
30
... a dodanie go do systemu Windows zajmuje 2 sekundy (w moim przypadku 8.1)> Panel sterowania> Dodaj programy> Włącz funkcje systemu Windows
Chris Moutray,
14
Tylko dla informacji: jeśli port nie jest otwarty: Łączenie z ##### ... Nie można otworzyć połączenia z hostem na porcie ####: Połączenie nie powiodło się; A jeśli port jest otwarty, skończysz w telnecie (CTRL +], a następnie „wyjdź”)
blackstrype
27

Dla celów skryptowych stwierdziłem, że to curlpolecenie może to zrobić, na przykład:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

Prawdopodobnie może nie działać dla wszystkich usług, ponieważ curlw niektórych przypadkach może zwracać różne kody błędów (zgodnie z komentarzem), więc dodanie następującego warunku może działać w niezawodny sposób:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

Uwaga: Dodano, -m5aby ustawić maksymalny limit czasu połączenia na 5 sekund.

Jeśli chcesz sprawdzić również, czy host jest ważny, musisz również sprawdzić 6kod wyjścia:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

Aby rozwiązać problem z zwróconym kodem błędu, po prostu uruchom:, curl host:portnp:

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Zobacz: man curlpełną listę kodów wyjścia.

kenorb
źródło
Niestety to nie działa dla mnie (przynajmniej na bash w OS X).
Mike Atlas
1
Usługa niestandardowa. FWIW to jakby działa: curl $IP:$PORTdaje: curl: (52) Empty reply from server(w przeciwieństwie curl: (7) Failed to connect), ale podobnie nc, nie mogę | grep Emptydla tych instrukcji wyjściowych, jak można by się spodziewać (coś o nowych wierszach lub braku natychmiastowego wyjścia?). Zakładam, że twoja linia jest warunkowa na podstawie kodu zakończenia, prawda? Jestem na El Cap; może w innych wersjach lub systemach operacyjnych -1raczej kończy się stan awarii niż 52?
Mike Atlas
Tak, to wystarczy. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas
Pytanie dotyczyło Windowsa, który oczywiście nie ma np. / Dev / null
Arthur Tacca
@ArthurTacca Zawsze możesz użyć podsystemu Windows dla systemu Linux (WSL).
kenorb
23

Naciśnij Windows+ Rwpisz cmdiEnter

W wierszu polecenia wpisz

telnet "machine name/ip" "port number"

Jeśli port nie jest otwarty, zostanie wyświetlony następujący komunikat:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

W przeciwnym razie zostaniesz przeniesiony do otwartego portu (wyświetli się pusty ekran)

Lew
źródło
7
Zauważ, że telnet nie jest instalowany domyślnie w nowoczesnych systemach Windows. Będziesz musiał zainstalować go z panelu sterowania Dodaj / Usuń funkcje systemu Windows.
Greg,
1
@Greg lub za pomocą narzędzia internetowego, takiego jak telnet-online.net
oz
2
@oz prawda, chyba że sprawdzasz stan serwera wewnętrznego
Greg
działa na Windows10
gaurav
19

Użyj polecenia nc,

nc -zv <hostname/ip> <port/port range>

For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

Możesz także użyć polecenia telnet

telnet <ip/host> port
minhas23
źródło
4

nc lub „netcat” ma również tryb skanowania, który może być przydatny.

caskey
źródło
3
Na komputerze Mac „zakres portów serwera nc -zv”
Vijay Kumar
2

Myślę, że szukasz Hping ( http://www.hping.org/ ), który ma wersję Windows.

„Interfejs jest inspirowany poleceniem ping (8) unix, ale hping nie tylko może wysyłać żądania echa ICMP. Obsługuje TCP, UDP, ICMP…”

Jest to również bardzo przydatne, jeśli chcesz zobaczyć, gdzie na trasie port TCP jest blokowany (na przykład przez zaporę ogniową), a ICMP może nie być.

Trueblood
źródło
2

W Bash możesz używać plików pseudourządzeń, które mogą otwierać połączenie TCP z powiązanym gniazdem. Składnia to/dev/$tcp_udp/$host_ip/$port .

Oto prosty przykład, aby sprawdzić, czy Memcached działa:

</dev/tcp/localhost/11211 && echo Port open || echo Port closed

Oto kolejny test, aby sprawdzić, czy określona witryna jest dostępna:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

Aby uzyskać więcej informacji, zajrzyj do: Advanced Bash-Scripting Guide: Rozdział 29. /devi/proc .

Powiązane: Sprawdź, czy port w systemie zdalnym jest osiągalny (bez telnetu) w SuperUser.

Aby uzyskać więcej przykładów, zobacz: Jak otworzyć gniazdo TCP / UDP w powłoce bash (artykuł).

kenorb
źródło
1
Wow, to jest genialne! Nie wiem, czy jest to możliwe po prostu bash. Jest to wygodne dla osób takich jak ja, które mają zainstalowane tylko git bash w systemie Windows i nie chcą instalować innej usługi.
dotslashlu