Перевірка стану одного порту на віддаленому хості [закрито]


158

Мені потрібен командний рядок, який може перевірити стан порту на віддаленому хості. Я спробував, ping xxx.xxx.xxx.xxx:161але він не визнає "хоста". Я думав, що це "хороша" відповідь, поки я не зробив ту саму команду проти хоста, за якого я знаю, цей порт відкритий. Це для пакетного файлу в Windows, який перевірить стан віддаленого порту, потім запустіть команду, яка використовує цей віддалений порт для інформації, потім ще раз перевірку віддаленого порту, потім команду, яка використовує цей порт на наступному сервері для отримання інформації , і так далі. Я шукав всюди і думав, що ping може це зробити, але повинні бути різні версії ping, я вважаю, що сервер, на якому я це роблю, не показує цього варіанту.

Тільки для посмішок я спробував веб-перевірку віддалених перевірок портів з веб-сайту - і результати були правильними як для "проблемного" сервера, так і для правильного сервера. Однак я не можу використовувати це в пакетному запуску з 500+ IP-адресами сервера.

Чи є щось, що я можу зробити, це просто? Мої навички Perl надзвичайно іржаві (користуйтеся або втрачайте), не знаю жодної іншої мови на базі Windows, крім пакетної. Unix - це моя майстерність, але це має бути виконано з Widows Server 2003.


5
Ви можете спробувати задати це на сервері defaultfault
Джон Раш,


1
Оскільки це запитання закрито, я відповів тут
npocmaka


windows ps> tnc xxx.xxx.xxx.xxx -port 161
Мусульманський

Відповіді:


151

Ви, здається, шукаєте сканер портів, таких як nmap або netcat , обидва вони доступні для Windows, Linux та Mac OS X.

Наприклад, перевірте наявність telnet на відомому ip:

nmap -A 192.168.0.5/32 -p 23

Наприклад, шукайте відкриті порти від 20 до 30 на host.example.com:

nc -z host.example.com 20-30

Обидва вони доступні для Windows.
Гленн

1
ваша команда nmap повинна мати справжній "-p23" без пробілу. nmap розглядає кожну одиницю, перед якою не одразу передує прапор, як окремий пункт сканування
Брендон Лебедєв,

14
повинно бути nc -zv host.example.com 20-30. інакше виходу немає
Aryeh Beitz

1
Опція -zдля ncне доступна в Linux.
valentin_nasta

1
@valentin_nasta так, можливо, це залежить від того, яку версію netcat ви використовуєте (gnu або openbsd). Ось відповідний рядок зі сторінки man для nc (openbsd версія) в моїй системі Arch linux: -z Вказує, що nc повинен просто сканувати для прослуховування демонів, не надсилаючи їм ніяких даних. Помилка використання цієї опції спільно з опцією -l
pgoetz

126

У командному рядку ви можете використовувати команду telnet. Наприклад, для підключення до IP 192.168.10.1 з портом 80,

telnet 192.168.10.1 80

Щоб увімкнути telnet у Windows 7 та вище, натисніть . З прив’язаної статті ввімкніть telnet через панель управління -> програми та функції -> функції Windows -> клієнт telnet, або просто запустіть це у запиті адміністратора:

dism /online /Enable-Feature /FeatureName:TelnetClient

3
Це найпростіший метод, якщо telnet встановлено на пристрої Windows
користувачеві linux Linux

30
... і для того, щоб додати його до Windows (у моєму випадку 8.1) потрібно 2 секунди> Панель управління> Додати програми> Увімкніть функції Windows
Chris Moutray

14
Тільки для інформації: якщо порт не відкритий: Підключення до ##### ... Не вдалося відкрити з'єднання з хостом, на порт ####: Підключення не вдалося; А якщо порт буде відкритий, ви опинитесь у telnet (CTRL +], тоді 'вийдете')
blackstrype

27

Для цілей сценарію я виявив, що curlкоманда може це зробити, наприклад:

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

Можливо, це може не працювати для всіх служб, оскільки curlможе повернути різні коди помилок у деяких випадках (за коментарем), тому додавання наступної умови може спрацювати надійно:

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

Примітка: Додано, -m5щоб встановити максимальний час очікування з'єднання 5 секунд.

Якщо ви також хочете перевірити, чи дійсний хост, вам також потрібно перевірити 6код виходу:

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

Щоб усунути непогашений код помилки, просто запустіть:, curl host:portнаприклад:

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

Див .: man curlповний список кодів виходу.


На жаль, це не працює для мене (принаймні, на bash в OS X).
Майк Атлас

1
Спеціальна послуга. FWIW це на зразок роботи: curl $IP:$PORTприносить: curl: (52) Empty reply from server(проти curl: (7) Failed to connect), але дуже схоже nc, я не можу | grep Emptyдля таких висновків виводу, як можна було б очікувати (щось про нові рядки або відсутність негайного виходу?). Я припускаю, що ваш рядок є умовно відключеним кодом виходу, правда? Я на El Cap; можливо, в інших версіях чи ОС, стан відмови виходить, -1а не 52?
Майк Атлас

Так, це зробить це. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Майк Атлас

Питання стосувалося Windows, яка, очевидно, не має напр. / Dev / null
Артур Такка

@ArthurTacca Ви завжди можете використовувати підсистему Windows для Linux (WSL).
kenorb

23

Натисніть Windows+ Rвведіть cmdіEnter

У командному рядку введіть

telnet "machine name/ip" "port number"

Якщо порт не відкритий, це повідомлення відображатиметься:

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

Інакше ви перейдете до відкритого порту (на екрані відобразиться порожній екран)


7
Зауважте, що telnet не встановлений за замовчуванням у сучасних системах Windows. Вам доведеться встановити його на панелі керування «Додати / видалити функції Windows».
Грег

1
@Greg або використовуючи Інтернет-інструмент, такий telnet-online.net
oz

2
@oz вірно, якщо ви не перевіряєте стан внутрішнього сервера
Грег

працює на Windows10
gaurav

19

Використовуйте команду nc,

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

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

Ви також можете використовувати команду telnet

telnet <ip/host> port


2

Я думаю, ви шукаєте Hping ( http://www.hping.org/ ), який має версію для Windows.

"Інтерфейс надихається на команду ping (8) unix, але hping не може лише відправляти запити ехо-сигналів ICMP. Він підтримує TCP, UDP, ICMP ..."

Це також дуже корисно, якщо ви хочете побачити, де вздовж маршруту блокується порт TCP (наприклад, через брандмауер), де ICMP може не бути.


2

У Bash ви можете використовувати файли псевдопристроїв, які можуть відкрити TCP-з'єднання з пов'язаним сокетом. Синтаксис є /dev/$tcp_udp/$host_ip/$port.

Ось простий приклад для перевірки того, чи працює Memcached:

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

Ось ще один тест, щоб дізнатися, чи доступний конкретний веб-сайт:

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

Для отримання додаткової інформації перегляньте: Розширений посібник із написання сценарію: Глава 29. /devі/proc .

Пов’язано: Перевірте, чи доступ до порта на віддаленій системі (без telnet) на SuperUser.

Докладніші приклади див. У розділі: Як відкрити TCP / UDP-розетку в оболонці bash (стаття).


1
Ого, це геній! Я не знаю, що це можливо з просто басом. Так зручно для таких людей, як я, у яких тільки встановлений git bash у Windows та не хочуть встановлювати інший сервіс.
dotslashlu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.