ตรวจสอบสถานะของหนึ่งพอร์ตบนรีโมตโฮสต์ [ปิด]


158

ฉันต้องการบรรทัดคำสั่งที่สามารถตรวจสอบสถานะพอร์ตบนรีโมตโฮสต์ ฉันพยายามping xxx.xxx.xxx.xxx:161แต่ไม่รู้จัก "โฮสต์" ฉันคิดว่ามันเป็นคำตอบที่ "ดี" จนกว่าฉันจะทำคำสั่งเดียวกันกับโฮสต์ที่ฉันรู้ว่าพอร์ตนั้นเปิด นี่เป็นไฟล์แบตช์บน Windows ที่จะตรวจสอบสถานะของพอร์ตระยะไกลจากนั้นเรียกใช้คำสั่งที่ใช้พอร์ตระยะไกลนั้นเพื่อรับข้อมูลจากนั้นคำสั่งตรวจสอบพอร์ตระยะไกลอีกครั้งจากนั้นคำสั่งที่ใช้พอร์ตนั้นบนเซิร์ฟเวอร์ถัดไป และอื่น ๆ ฉันดูทุกที่และคิดว่า ping อาจทำได้ แต่ต้องมี ping หลายเวอร์ชันฉันคิดว่าเพราะเซิร์ฟเวอร์ที่ฉันกำลังทำอยู่ไม่แสดงตัวเลือกนั้น

เพียงหัวเราะเบา ๆ ฉันลองใช้ตัวตรวจสอบพอร์ตระยะไกลผ่านเว็บจากเว็บไซต์ - และผลลัพธ์นั้นถูกต้องสำหรับทั้งเซิร์ฟเวอร์ "ปัญหา" และเซิร์ฟเวอร์ที่ถูกต้อง อย่างไรก็ตามฉันไม่สามารถใช้มันในการทำงานแบบแบตช์ด้วย IP ของเซิร์ฟเวอร์ 500+ ในนั้น

มีสิ่งที่ฉันสามารถทำได้ง่ายหรือไม่ ทักษะ Perl ของฉันเป็นสนิมอย่างมาก (ใช้หรือสูญเสีย) ไม่ทราบภาษาอื่น ๆ ที่ใช้ Windows ยกเว้นชุดงาน Unix เป็นทักษะของฉัน แต่ต้องดำเนินการจาก Widows Server 2003


5
คุณอาจต้องการลองถามสิ่งนี้ที่ serverfault.com
John Rasch

1
มีคนทำเช่นนี้แล้ว: serverfault.com/questions/309357/ping-a-specific-port
Vadzim

1
เนื่องจากคำถามนี้ถูกปิดฉันได้ตอบที่นี่
npocmaka


windows ps> tnc xxx.xxx.xxx.xxx -port 161
Moslem Shahsavan

คำตอบ:


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 ปฏิบัติต่อแต่ละหน่วยที่ไม่ได้นำหน้าด้วยธงทันทีในฐานะปลายทางการสแกนแยกต่างหาก
Brandon Lebedev

14
nc -zv host.example.com 20-30ควรจะเป็น มิฉะนั้นจะไม่มีผลลัพธ์
Aryeh Beitz

1
ตัวเลือก-zสำหรับncไม่พร้อมใช้งานบน Linux
valentin_nasta

1
@valentin_nasta ใช่มันอาจจะขึ้นอยู่กับเวอร์ชันของ netcat ที่คุณใช้ (gnu หรือ openbsd) นี่คือบรรทัดที่เกี่ยวข้องจาก man page สำหรับ nc (เวอร์ชัน openbsd) บนระบบ Arch linux ของฉัน: -z ระบุว่า nc ควรสแกนหา daemons โดยไม่ต้องส่งข้อมูลใด ๆ มันเป็นข้อผิดพลาดในการใช้ตัวเลือกนี้ร่วมกับตัวเลือก -l
pgoetz

126

ใน Command Prompt คุณสามารถใช้คำสั่ง 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
ผู้ใช้ shonky linux

30
... และใช้เวลา 2 วินาทีในการเพิ่มลงใน windows (8.1 ในกรณีของฉัน)> แผงควบคุม> เพิ่ม Programes> เปิดคุณสมบัติของ 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)
Mike Atlas

1
บริการที่กำหนดเอง FWIW มันเรียงลำดับของงาน: curl $IP:$PORTให้ผลตอบแทน: curl: (52) Empty reply from server(กับcurl: (7) Failed to connect) แต่ไม่เหมือนncกันฉันไม่สามารถ| grep Emptyใช้คำสั่งเอาต์พุตเหล่านี้อย่างที่ใคร ๆ ก็คาดหวังได้ ฉันเข้าใจว่าสายของคุณเป็นเงื่อนไขตามรหัสทางออกใช่ไหม? ฉันอยู่ที่ El Cap; อาจเป็นในรุ่นอื่น ๆ หรือระบบปฏิบัติการล้มเหลวสถานะออก-1มากกว่า52?
Mike Atlas

ใช่ว่าจะทำมัน curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas

คำถามเกี่ยวกับ Windows ซึ่งเห็นได้ชัดว่าไม่มีเช่น / dev / null
Arthur Tacca

@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 สมัยใหม่ คุณจะต้องติดตั้งจากแผงควบคุม Add / Remove Windows Features
เกร็ก

1
@ Greg หรือใช้เครื่องมือออนไลน์เช่นtelnet-online.net
oz

2
@oz จริงเว้นแต่คุณจะตรวจสอบสถานะของเซิร์ฟเวอร์ภายใน
Greg

ใช้งานได้กับ 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

4

nc หรือ 'netcat' ยังมีโหมดสแกนซึ่งอาจมีการใช้งาน


3
บน Mac "พอร์ตเซิร์ฟเวอร์ช่วง nc -zv"
Vijay Kumar

2

ฉันคิดว่าคุณกำลังมองหา Hping ( http://www.hping.org/ ) ซึ่งมีเวอร์ชั่น Windows

"อินเตอร์เฟสได้รับแรงบันดาลใจจากคำสั่ง ping (8) unix แต่ hping ไม่เพียง แต่สามารถส่งคำขอ ICMP echo ได้เท่านั้นรองรับ 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.

สำหรับข้อมูลเพิ่มเติมตรวจสอบ: ขั้นสูงทุบตี Scripting Guide: บทที่ 29/dev/procและ

สิ่งที่เกี่ยวข้อง: ทดสอบว่าพอร์ตบนระบบรีโมตสามารถเข้าถึงได้ (ไม่มี telnet)ที่ SuperUser

สำหรับตัวอย่างเพิ่มเติมดู: วิธีเปิดซ็อกเก็ต TCP / UDP ใน bash shell (บทความ)


1
ว้าวนี่เป็นอัจฉริยะ! ฉันไม่รู้ว่ามันเป็นไปได้ด้วยการทุบตี สะดวกมากสำหรับคนอย่างฉันที่เพิ่งติดตั้ง git bash บน Windows และไม่ต้องการติดตั้งบริการอื่น
dotslashlu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.