Kiểm tra trạng thái của một cổng trên máy chủ từ xa [đã đóng]


158

Tôi cần một dòng lệnh có thể kiểm tra trạng thái cổng trên một máy chủ từ xa. Tôi đã thử ping xxx.xxx.xxx.xxx:161nhưng nó không nhận ra "máy chủ". Tôi nghĩ rằng đó là một câu trả lời "tốt" cho đến khi tôi thực hiện cùng một lệnh với máy chủ mà tôi biết có cổng đó mở. Đây là một tệp bó trên Windows sẽ kiểm tra trạng thái của cổng từ xa, sau đó chạy lệnh sử dụng cổng từ xa đó để lấy thông tin, sau đó lại kiểm tra cổng từ xa, sau đó lệnh sử dụng cổng đó trên máy chủ tiếp theo để biết thông tin , và như thế. Tôi đã nhìn khắp nơi và nghĩ rằng ping có thể làm điều đó, nhưng phải có nhiều phiên bản ping khác nhau, tôi cho rằng máy chủ tôi đang làm điều này không hiển thị tùy chọn đó.

Chỉ để cười khúc khích, tôi đã thử một trình kiểm tra cổng từ xa dựa trên web từ một trang web - và kết quả là chính xác cho cả máy chủ "có vấn đề" và máy chủ chính xác. Tuy nhiên, tôi không thể sử dụng nó trong một đợt chạy với hơn 500 IP máy chủ trong đó.

Có một cái gì đó tôi có thể làm điều đó là đơn giản? Các kỹ năng Perl của tôi cực kỳ yếu (sử dụng hoặc mất nó), không biết bất kỳ ngôn ngữ dựa trên Windows nào khác ngoại trừ lô. Unix là kỹ năng của tôi, nhưng điều này phải được thực thi từ Widows Server 2003.


5
Bạn có thể muốn thử hỏi điều này tại serverfault.com
John Rasch


1
Khi câu hỏi này được đóng lại, tôi đã trả lời ở đây
npocmaka


cửa sổ ps> tnc xxx.xxx.xxx.xxx -port 161
Moslem Shahsavan

Câu trả lời:


151

Bạn dường như đang tìm kiếm một trình quét cổng như nmap hoặc netcat , cả hai đều có sẵn cho Windows, Linux và Mac OS X.

Ví dụ: kiểm tra telnet trên một ip đã biết:

nmap -A 192.168.0.5/32 -p 23

Ví dụ: tìm các cổng mở từ 20 đến 30 trên host.example.com:

nc -z host.example.com 20-30

Cả hai đều có sẵn cho Windows.
Glenn

1
lệnh nmap của bạn phải thực "-p23" mà không có khoảng trắng. nmap coi mỗi đơn vị không được đặt trước cờ như một đích quét riêng
Brandon Lebedev

14
nên nc -zv host.example.com 20-30. nếu không thì không có đầu ra
Aryeh Beitz

1
Tùy chọn -zcho nckhông có sẵn trên Linux.
valentin_nasta

1
@valentin_nasta vâng, có lẽ, tùy thuộc vào phiên bản netcat bạn đang sử dụng (gnu hoặc openbsd). Đây là dòng có liên quan từ trang man cho nc (phiên bản openbsd) trên hệ thống Arch linux của tôi: -z Chỉ định rằng nc chỉ nên quét để nghe daemon, mà không gửi bất kỳ dữ liệu nào cho chúng. Đó là một lỗi khi sử dụng tùy chọn này kết hợp với tùy chọn -l
pgoetz

126

Trong Dấu nhắc lệnh, bạn có thể sử dụng lệnh telnet .. Ví dụ: để kết nối với IP 192.168.10.1 với cổng 80,

telnet 192.168.10.1 80

Để kích hoạt telnet trong Windows 7 trở lên, nhấp vào . Từ bài viết được liên kết, bật telnet thông qua bảng điều khiển -> chương trình và tính năng -> tính năng của windows -> ứng dụng khách telnet hoặc chỉ chạy phần này trong lời nhắc của quản trị viên:

dism /online /Enable-Feature /FeatureName:TelnetClient

3
Đây là phương pháp đơn giản nhất nếu telnet được cài đặt trên thiết bị Windows
người dùng linux shonky

30
... và phải mất 2 giây để thêm nó vào windows (8.1 trong trường hợp của tôi)> Bảng điều khiển> Thêm chương trình> Bật các tính năng của windows
Chris Moutray 7/214

14
Chỉ để biết thông tin: nếu cổng không mở: Kết nối với ##### ... Không thể mở kết nối với máy chủ, trên cổng ####: Kết nối thất bại; Và nếu cổng được mở, bạn sẽ kết thúc bằng telnet (CTRL +] sau đó 'thoát')
blackstrype

27

Đối với mục đích tạo kịch bản, tôi đã thấy rằng curllệnh có thể thực hiện được, ví dụ:

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

Có thể nó sẽ không hoạt động đối với tất cả các dịch vụ, vì curlcó thể trả về các mã lỗi khác nhau trong một số trường hợp (theo nhận xét), vì vậy việc thêm điều kiện sau có thể hoạt động theo cách đáng tin cậy:

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

Lưu ý: Đã thêm -m5để đặt thời gian chờ kết nối tối đa là 5 giây.

Nếu bạn cũng muốn kiểm tra xem máy chủ có hợp lệ không, bạn cũng cần kiểm tra 6mã thoát:

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

Để khắc phục mã lỗi được trả về, chỉ cần chạy : curl host:port, ví dụ:

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

Xem: man curlđể biết danh sách đầy đủ các mã thoát.


Thật không may, điều này không phù hợp với tôi (ít nhất là trên bash trong OS X).
Mike Atlas

1
Một dịch vụ tùy chỉnh. FWIW nó sắp xếp các công việc: curl $IP:$PORTsản lượng: curl: (52) Empty reply from server(so với curl: (7) Failed to connect) nhưng rất giống nc, tôi không thể | grep Emptycho các báo cáo đầu ra như người ta có thể mong đợi (một cái gì đó về dòng mới hoặc thiếu đầu ra ngay lập tức?). Tôi đoán dòng của bạn là một điều kiện dựa trên mã thoát, phải không? Tôi đang ở trên El Cap; có thể trong các phiên bản hoặc hệ điều hành khác, trạng thái lỗi -1không tồn tại 52?
Mike Atlas

Vâng, điều đó sẽ làm điều đó. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas

Câu hỏi là về Windows, mà rõ ràng là không có ví dụ / dev / null
Arthur Tacca

@ArthurTacca Bạn luôn có thể sử dụng Hệ thống con Windows cho Linux (WSL).
kenorb

23

Nhấn Windows+ RcmdEnter

Trong kiểu nhắc lệnh

telnet "machine name/ip" "port number"

Nếu cổng không mở, thông báo này sẽ hiển thị:

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

Nếu không, bạn sẽ được đưa vào cổng đã mở (màn hình trống sẽ hiển thị)


7
Lưu ý rằng telnet không được cài đặt theo mặc định trên các hệ thống cửa sổ hiện đại. Bạn sẽ phải cài đặt nó từ bảng điều khiển Thêm / Xóa tính năng của Windows.
Greg

1
@Greg hoặc sử dụng một công cụ trực tuyến như telnet-online.net
oz

2
@oz đúng, trừ khi bạn kiểm tra trạng thái của máy chủ nội bộ
Greg

hoạt động trên Windows10
gaurav

19

Sử dụng lệnh nc,

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

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

Bạn cũng có thể sử dụng lệnh telnet

telnet <ip/host> port

4

nc hoặc 'netcat' cũng có chế độ quét có thể được sử dụng.


3
Trên Mac "nc -zv máy chủ phạm vi cổng"
Vijay Kumar

2

Tôi nghĩ rằng bạn đang tìm kiếm Hping ( http://www.hping.org/ ), có phiên bản Windows.

"Giao diện được lấy cảm hứng từ lệnh unix ping (8), nhưng hping không chỉ có thể gửi các yêu cầu echo ICMP. Nó hỗ trợ TCP, UDP, ICMP ..."

Nó cũng rất hữu ích nếu bạn muốn xem vị trí dọc theo tuyến đường mà cổng TCP đang bị chặn (như tường lửa), nơi ICMP có thể không ở đó.


2

Trong Bash, bạn có thể sử dụng các tệp thiết bị giả có thể mở kết nối TCP đến ổ cắm liên quan. Cú pháp là /dev/$tcp_udp/$host_ip/$port.

Dưới đây là ví dụ đơn giản để kiểm tra xem Memcached có chạy hay không:

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

Đây là một thử nghiệm khác để xem trang web cụ thể có thể truy cập được không:

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

Để biết thêm thông tin, hãy kiểm tra: Hướng dẫn Bash-Scripting nâng cao: Chương 29. /dev/proc .

Liên quan: Kiểm tra nếu một cổng trên hệ thống từ xa có thể truy cập (không có telnet) tại SuperUser.

Để biết thêm ví dụ, hãy xem: Cách mở ổ cắm TCP / UDP trong vỏ bash (bài viết).


1
Wow, đây là thiên tài! Tôi không biết điều này là có thể chỉ với bash. Vì vậy, thuận tiện cho những người như tôi chỉ cài đặt git bash trên Windows và không muốn cài đặt dịch vụ khác.
dotlashlu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.