ทดสอบว่าพอร์ต TCP ระยะไกลเปิดจากเชลล์สคริปต์หรือไม่


297

ฉันกำลังมองหาวิธีที่รวดเร็วและง่าย ๆ ในการทดสอบว่าพอร์ต TCP ที่กำหนดนั้นเปิดอยู่บนเซิร์ฟเวอร์ระยะไกลหรือไม่จากสคริปต์ Shell

ฉันจัดการที่จะทำมันด้วยคำสั่ง telnet และมันทำงานได้ดีเมื่อพอร์ตถูกเปิด แต่ดูเหมือนจะไม่หมดเวลาเมื่อมันไม่ได้และเพิ่งแฮงค์ที่นั่น ...

นี่คือตัวอย่าง:

l_TELNET=`echo "quit" | telnet $SERVER $PORT | grep "Escape character is"`
if [ "$?" -ne 0 ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

ฉันต้องการวิธีที่ดีกว่าหรือวิธีบังคับให้ telnet หมดเวลาใช้งานหากไม่ได้เชื่อมต่อภายใน 8 วินาทีและส่งคืนสิ่งที่ฉันสามารถจับได้ใน Shell (โค้ดส่งคืนหรือสตริงใน stdout)

ฉันรู้วิธี Perl ซึ่งใช้โมดูล IO :: Socket :: INET และเขียนสคริปต์ที่ประสบความสำเร็จซึ่งทดสอบพอร์ต แต่ต้องการหลีกเลี่ยงการใช้ Perl หากเป็นไปได้

หมายเหตุ: นี่คือสิ่งที่เซิร์ฟเวอร์ของฉันกำลังทำงาน (ที่ฉันต้องเรียกใช้จาก)

SunOS 5.10 Generic_139556-08 i86pc i386 i86pc


สิ่งที่เกี่ยวกับNetcatหรือNmap ?
Jeremiah Willcock

คำตอบโกหกด้วยความคาดหวัง เราเขียนสคริปต์ง่ายๆที่ส่ง telnet บนพอร์ตที่เราต้องการด้วยเวลาหมดเวลา 8 วินาที มีตัวอย่างมากมายให้เลือกเช่นกัน เราอ้างอิงจากโพสต์นี้: unix.com/shell-programming-scripting/ …
Yanick Girouard

1
check_tcp จากgithub.com/monitoring-plugins/monitoring-pluginsสามารถทำได้รวมถึงการป้อนสตริงและการตรวจสอบคำตอบที่คาดหวัง

คำตอบ:


452

ตามที่โรดส์บีชี้ncจะทำงาน วิธีใช้งานที่กะทัดรัดยิ่งขึ้น:

nc -z <host> <port>

ด้วยวิธีncดังกล่าวจะตรวจสอบว่าพอร์ตเปิดอยู่เท่านั้นการออกจาก 0 เมื่อสำเร็จหรือ 1 ล้มเหลว

สำหรับการตรวจสอบแบบอินเทอร์แอคทีฟอย่างรวดเร็ว (ด้วยการหมดเวลา 5 วินาที):

nc -z -v -w5 <host> <port>

48
centos7 ใช้ค่าเริ่มต้น nmap netcat และไม่มีตัวเลือก -z
jolestar

7
สิ่งนี้ไม่ทำงานใน RHEL / Centos สำหรับ distros เหล่านั้นคุณต้อง: nc -vn <host> <port>
Justin Dennahower

2
FWIW ฉันได้แก้ไขคำตอบของฉันพร้อมตัวอย่างแยกกันใช้กับทั้ง RHEL 6 และ RHEL 7
คิวเมนตัส

4
อย่างน้อยบน Mac คุณอาจต้องเพิ่ม-G#การตั้งค่าการหมดเวลาการเชื่อมต่อแยกจาก / นอกเหนือจากการ-w#หมดเวลาซึ่งโดยทั่วไปจะทำหน้าที่เป็นการหมดเวลาการอ่าน
Doktor J

1
@jolestar คุณสามารถอัพเกรด Ncat ด้วยตนเองบน Centos 7 เพื่อรับ-zตัวเลือก คุณอาจต้องการพิจารณา: unix.stackexchange.com/questions/393762/…
Damien Ó Ceallaigh

150

มันง่ายพอที่จะทำกับตัวเลือก-zและ-w TIMEOUTตัวเลือกncแต่ไม่ได้ncติดตั้งระบบทั้งหมด หากคุณมีทุบตีรุ่นล่าสุดพอจะใช้งานได้:

# Connection successful:
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/google.com/80'
$ echo $?
0

# Connection failure prior to the timeout
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/sfsfdfdff.com/80'
bash: sfsfdfdff.com: Name or service not known
bash: /dev/tcp/sfsfdfdff.com/80: Invalid argument
$ echo $?
1

# Connection not established by the timeout
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/google.com/81'
$ echo $?
124

สิ่งที่เกิดขึ้นที่นี่คือการtimeoutเรียกใช้คำสั่งย่อยและฆ่าหากไม่ออกภายในเวลาที่กำหนด (1 วินาทีในตัวอย่างด้านบน) ในกรณีนี้bashคือคำสั่งย่อยและใช้การจัดการ/ dev / tcp พิเศษเพื่อลองและเปิดการเชื่อมต่อกับเซิร์ฟเวอร์และพอร์ตที่ระบุ หากbashสามารถเปิดการเชื่อมต่อภายในการหมดเวลาที่catจะอยู่ใกล้ทันที (ตั้งแต่มันอ่านจาก/dev/null) และออกที่มีรหัสสถานะของ0ซึ่งจะเผยแพร่ผ่านแล้วbash timeoutหากbashได้รับการเชื่อมต่อล้มเหลวก่อนที่จะหมดเวลาที่ระบุแล้วbashจะออกด้วยรหัสออก 1 ซึ่งtimeoutจะกลับมา และถ้าทุบตีไม่สามารถสร้างการเชื่อมต่อและหมดเวลาที่ระบุหมดอายุแล้วtimeoutจะฆ่าbashและออกด้วยสถานะ 124


1
คือ/dev/tcpมีอยู่ในระบบอื่น ๆ กว่าลินุกซ์? แล้ว Macs เป็นพิเศษเกี่ยวกับอะไร?
ปีเตอร์

8
สิ่ง / dev / tcp เป็นคุณลักษณะของ bash ดังนั้นใช่ อย่างไรก็ตามดูเหมือนว่า Mac จะไม่มีการหมดเวลา ...
เฉพาะ

1
@onlynone - ดูเหมือนว่าtimeoutจะไม่มีอยู่ใน FreeBSD และในกล่อง Ubuntu เก่าของฉันมันเป็นแพ็คเกจที่ติดตั้งได้ แต่ไม่มีตามค่าเริ่มต้น จะดีถ้ามีวิธีการทำเช่นนี้ในการทุบตีคนเดียวโดยไม่มีเครื่องมือของบุคคลที่สามเช่นหมดเวลาหรือ netcat
เกรแฮม

3
แค่อยากจะพูดถึงว่าtimeoutจะปรากฏขึ้นเป็นส่วนหนึ่งของ coreutils GNU และสามารถติดตั้งบนแม็คกับ brew install coreutilshomebrew: gtimeoutแล้วมันจะใช้ได้ในฐานะที่
ไม่มี

1
@Wildcard บันทึกการเปลี่ยนแปลงทุบตีแนะนำbash-2.04-develแม้ว่าอาจมีการสนับสนุนชื่อโฮสต์แล้วbash-2.05-alpha1ก็ตาม
คิวเมนตัส

109

TOC:

  • ใช้ทุบตีและ timeout
    • คำสั่ง
    • ตัวอย่าง
  • การใช้ nc
    • คำสั่ง
    • RHEL 6 (nc-1.84)
      • การติดตั้ง
      • ตัวอย่าง
    • RHEL 7 (nmap-ncat-6.40)
      • การติดตั้ง
      • ตัวอย่าง
  • หมายเหตุ

ใช้ทุบตีและtimeout:

โปรดทราบว่าtimeoutควรมี RHEL 6+ หรือพบได้ใน GNU coreutils 8.22 บน MacOS, ติดตั้งโดยใช้และใช้เป็นbrew install coreutilsgtimeout

คำสั่ง:

$ timeout $TIMEOUT_SECONDS bash -c "</dev/tcp/${HOST}/${PORT}"; echo $?

หากทำการโฮสต์โฮสต์และพอร์ตตรวจสอบให้แน่ใจว่าได้ระบุเป็น${HOST}และ${PORT}ตามที่ระบุไว้ด้านบน อย่าระบุเพียงแค่เป็น$HOSTและ$PORTไม่มีการจัดฟัน มันจะไม่ทำงานในกรณีนี้

ตัวอย่าง:

ความสำเร็จ:

$ timeout 2 bash -c "</dev/tcp/canyouseeme.org/80"; echo $?
0

ล้มเหลว:

$ timeout 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?
124

ถ้าคุณต้องรักษาสถานะออกจากbash,

$ timeout --preserve-status 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?
143

การใช้nc:

โปรดทราบว่าncจะมีการติดตั้งเวอร์ชันย้อนหลังที่เข้ากันไม่ได้ใน RHEL 7

คำสั่ง:

โปรดทราบว่าคำสั่งด้านล่างนั้นไม่เหมือนกันสำหรับทั้ง RHEL 6 และ 7 มันเป็นเพียงการติดตั้งและเอาท์พุทที่แตกต่างกัน

$ nc -w $TIMEOUT_SECONDS -v $HOST $PORT </dev/null; echo $?

RHEL 6 (nc-1.84):

การติดตั้ง:

$ sudo yum install nc

ตัวอย่าง:

ความสำเร็จ:
$ nc -w 2 -v canyouseeme.org 80 </dev/null; echo $?
Connection to canyouseeme.org 80 port [tcp/http] succeeded!
0
ล้มเหลว:
$ nc -w 2 -v canyouseeme.org 81 </dev/null; echo $?
nc: connect to canyouseeme.org port 81 (tcp) timed out: Operation now in progress
1

หากชื่อโฮสต์จับคู่กับ IP หลาย ๆ คำสั่งที่ล้มเหลวด้านบนจะวนไปวนมาหลายคนหรือทั้งหมด ตัวอย่างเช่น:

$ nc -w 2 -v microsoft.com 81 </dev/null; echo $?
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
1

RHEL 7 (nmap-ncat-6.40):

การติดตั้ง:

$ sudo yum install nmap-ncat

ตัวอย่าง:

ความสำเร็จ:
$ nc -w 2 -v canyouseeme.org 80 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 52.202.215.126:80.
Ncat: 0 bytes sent, 0 bytes received in 0.22 seconds.
0
ล้มเหลว:
$ nc -w 2 -v canyouseeme.org 81 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connection timed out.
1

หากชื่อโฮสต์จับคู่กับ IP หลาย ๆ คำสั่งที่ล้มเหลวด้านบนจะวนไปวนมาหลายคนหรือทั้งหมด ตัวอย่างเช่น:

$ nc -w 2 -v microsoft.com 81 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connection to 104.43.195.251 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 23.100.122.175 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 23.96.52.53 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 191.239.213.197 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection timed out.
1

หมายเหตุ:

-v( --verbose) โต้แย้งและecho $?คำสั่งของหลักสูตรสำหรับภาพเท่านั้น


3
timeout 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?เป็นจุดที่ดี!
ipeacocks

เพิ่มลง2>&1ในสถานะที่ไม่แสดง result_test=$(nc -w 2 $ip_addreess 80 </dev/null 2>&1 ; echo $?)
Sanya Snex

55

ด้วยnetcatคุณสามารถตรวจสอบว่าพอร์ตเปิดอยู่เช่นนี้หรือไม่:

nc my.example.com 80 < /dev/null

ค่าส่งคืนของncจะสำเร็จถ้าพอร์ต TCP ถูกเปิดและความล้มเหลว (โดยทั่วไปคือรหัสส่งคืน 1) หากไม่สามารถทำการเชื่อมต่อ TCP ได้

บางรุ่นจะแขวนเมื่อคุณพยายามที่นี้เพราะพวกเขาไม่ได้ใกล้เคียงกับครึ่งปีส่งซ็อกเก็ตของพวกเขาแม้หลังจากได้รับการสิ้นสุดของแฟ้ม-จากnc /dev/nullสำหรับแล็ปท็อป Ubuntu ของฉันเอง (18.04) netcat-openbsdเวอร์ชันของ netcat ที่ฉันติดตั้งนั้นมีวิธีแก้ไข: -Nตัวเลือกจำเป็นต้องได้รับผลทันที:

nc -N my.example.com 80 < /dev/null

1
ใช้งานได้ดีสำหรับรสชาติ ncที่ไม่รองรับ-wธง
David Dossot

5
ขอบคุณ - ยังใช้งานได้กับ nc รุ่นที่ไม่-zรองรับ - ทำงานบน RHEL / CentOS 7 เช่น
Andrew

1
แม้ว่าวิธีการนี้จะดี แต่-wก็จำเป็น แต่การล้มเหลวซึ่งคำสั่งเมื่อใช้ในสคริปต์สามารถหยุดทำงานได้นานกว่าสิบวินาที ผมได้เขียนคำตอบ-wซึ่งรวมถึง
คิวเมนตัส

2
+1 นี่ยอดเยี่ยมเพราะ nc มาพร้อมกับอัลไพน์ลินุกซ์และอูบุนตูทั้งคู่ อาจอื่น ๆ ไม่จำเป็นต้องติดตั้งเพิ่มเติมเมื่อคุณ remoting และไม่สามารถ ขอบคุณสำหรับสิ่งนี้! ฉันอาจเพิ่มnc host port -w 2 && echo it works
std''OrgnlDave

2
nc -vz localhost 3306ฉันชอบ มันให้ผลลัพธ์ verbose มากขึ้น พยายามบน mac เท่านั้น
EFreak

29

ใน Bash โดยใช้ไฟล์อุปกรณ์หลอกสำหรับการเชื่อมต่อ TCP / UDP ตรงไปตรงมา นี่คือสคริปต์:

#!/usr/bin/env bash
SERVER=example.com
PORT=80
</dev/tcp/$SERVER/$PORT
if [ "$?" -ne 0 ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

การทดสอบ:

$ ./test.sh 
Connection to example.com on port 80 succeeded

นี่คือหนึ่งซับ (ไวยากรณ์ Bash):

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

โปรดทราบว่าเซิร์ฟเวอร์บางเครื่องสามารถป้องกันไฟร์วอลล์จากการโจมตีของ SYN ที่ท่วมท้นดังนั้นคุณอาจพบว่าการเชื่อมต่อ TCP หมดเวลา (~ 75 วินาที) หากต้องการแก้ไขปัญหาการหมดเวลาให้ลอง:

timeout 1 bash -c "</dev/tcp/stackoverflow.com/81" && echo Port open. || echo Port closed.

โปรดดู: วิธีลดการเชื่อมต่อ TCP () หมดเวลาการโทรของระบบได้อย่างไร


1
@ABB สิ่งนี้เกี่ยวข้องกับการกำหนดค่าไฟร์วอลล์ของเซิร์ฟเวอร์ซึ่งไม่ตอบสนองใด ๆ เพื่อป้องกันการโจมตีด้วย SYN วิ่งtelnet canyouseeme.org 81ยังแขวน สิ่งนี้ถูกควบคุมโดยการ จำกัด การหมดเวลาของคุณซึ่งอาจจะเป็นแบบฮาร์ดโค้ดในการทุบตี ดู: ลด TCP () เชื่อมต่อหมดเวลาการเรียกระบบ
kenorb

สำหรับตัวแปรที่ตอนนี้ดูเหมือนว่าจะมีความจำเป็นในการระบุ$SERVERและ$PORTมีการจัดฟันอย่างน้อยเป็นและ${SERVER} ${PORT}
คิวเมนตัส

13

ผมจำเป็นต้องมีวิธีการแก้ปัญหาที่มีความยืดหยุ่นมากขึ้นสำหรับการทำงานในที่เก็บ Git หลายดังนั้นฉันเขียนรหัสดวลจุดโทษต่อไปขึ้นอยู่กับ1และ2 คุณสามารถใช้ที่อยู่เซิร์ฟเวอร์แทน gitlab.com และพอร์ตของคุณแทน 22

SERVER=gitlab.com
PORT=22
nc -z -v -w5 $SERVER $PORT
result1=$?

#Do whatever you want

if [  "$result1" != 0 ]; then
  echo  'port 22 is closed'
else
  echo 'port 22 is open'
fi

1
ขอบคุณ! มันทำให้ชีวิตของฉันง่ายขึ้นสำหรับ /etc/rc.local
Shahin Khaled

10

หากคุณกำลังใช้kshหรือทุบตีพวกเขาทั้งสองสนับสนุน IO เปลี่ยนเส้นทางไปยัง / จากซ็อกเก็ตโดยใช้/ dev / TCP / IP / PORTสร้าง ในการนี้เปลือกกรตัวอย่างเช่นฉันกำลังเปลี่ยนเส้นทางไม่-op ของ ( : ) STD-จากซ็อกเก็ต:

W$ python -m SimpleHTTPServer &
[1]     16833
Serving HTTP on 0.0.0.0 port 8000 ...
W$ : </dev/tcp/127.0.0.1/8000

เชลล์พิมพ์ข้อผิดพลาดหากซ็อกเก็ตไม่เปิดอยู่:

W$ : </dev/tcp/127.0.0.1/8001
ksh: /dev/tcp/127.0.0.1/8001: cannot open [Connection refused]

คุณสามารถใช้สิ่งนี้เป็นการทดสอบในเงื่อนไขif :

SERVER=127.0.0.1 PORT=8000
if (: < /dev/tcp/$SERVER/$PORT) 2>/dev/null
then
    print succeeded
else
    print failed
fi

no-op อยู่ใน subshell ดังนั้นฉันสามารถทิ้ง std-err ไปหากการเปลี่ยนเส้นทาง std-in ล้มเหลว

ฉันมักจะใช้/ dev / tcpเพื่อตรวจสอบความพร้อมของทรัพยากรผ่าน HTTP:

W$ print arghhh > grr.html
W$ python -m SimpleHTTPServer &
[1]     16863
Serving HTTP on 0.0.0.0 port 8000 ...
W$ (print -u9 'GET /grr.html HTTP/1.0\n';cat <&9) 9<>/dev/tcp/127.0.0.1/8000
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.6.1
Date: Thu, 14 Feb 2013 12:56:29 GMT
Content-type: text/html
Content-Length: 7
Last-Modified: Thu, 14 Feb 2013 12:55:44 GMT

arghhh
W$ 

ซับในหนึ่งบรรทัดนี้เปิดตัวอธิบายไฟล์ 9สำหรับการอ่านและเขียนไปยังซ็อกเก็ตพิมพ์HTTP GETไปยังซ็อกเก็ตและใช้catเพื่ออ่านจากซ็อกเก็ต


1
@ABB ฉันคิดว่าคุณหมายความว่าแฮงค์เป็นเวลานานหากพอร์ตไม่ตอบสนองเช่นเมื่อถูกกรองหรือไม่มีอะไรใน IP พอร์ตปิดไม่ทำให้เกิดความล่าช้าหากพอร์ตปฏิเสธการเชื่อมต่ออย่างแข็งขัน สำหรับวัตถุประสงค์หลายข้อนี้ค่อนข้างยอมรับได้
mc0e

เทคนิคนี้ถูกโพสต์ไว้แล้วก่อนที่คำตอบนี้ในคำตอบก่อนโดย kenorb อย่างไรก็ตามจุดที่ใหญ่กว่าก็คืออย่างไรก็ตามมันค้างเป็นเวลานานถ้าพอร์ตไม่ตอบสนอง ตัวอย่างเช่นลองแล้ว</dev/tcp/canyouseeme.org/80 </dev/tcp/canyouseeme.org/81
คิวเมนตัส

9

ในขณะที่คำถามเก่าฉันเพิ่งจะจัดการกับมันแตกต่างกัน แต่ไม่มีวิธีแก้ปัญหาที่นี่ใช้ได้ดังนั้นฉันจึงพบอีกและกำลังเพิ่มสำหรับลูกหลาน ใช่ฉันรู้ว่า OP บอกว่าพวกเขาตระหนักถึงตัวเลือกนี้และมันไม่เหมาะกับพวกเขา แต่สำหรับใครก็ตามที่ติดตามในภายหลังอาจพิสูจน์ได้ว่ามีประโยชน์

ในกรณีของฉันฉันต้องการทดสอบความพร้อมใช้งานของapt-cacher-ngบริการท้องถิ่นจากdockerบิลด์ นั่นหมายความว่าไม่มีอะไรสามารถติดตั้งได้ก่อนการทดสอบ ไม่มีnc, nmap, expect, หรือ telnet อย่างไรก็ตามมีอยู่พร้อมกับไลบรารีหลักดังนั้นฉันจึงใช้สิ่งนี้:pythonperl

perl -MIO::Socket::INET -e 'exit(! defined( IO::Socket::INET->new("172.17.42.1:3142")))'

6

ในบางกรณีที่เครื่องมือเช่นขด, telnet, nc o nmap ไม่พร้อมใช้งานคุณยังคงมีโอกาสในการ wget

if [[ $(wget -q -t 1 --spider --dns-timeout 3 --connect-timeout 10  host:port; echo $?) -eq 0 ]]; then echo "OK"; else echo "FAIL"; fi

6

ตรวจสอบพอร์ตโดยใช้ bash

ตัวอย่าง

$ ./test_port_bash.sh 192.168.7.7 22

พอร์ต 22 เปิดอยู่

รหัส

HOST=$1
PORT=$2
exec 3> /dev/tcp/${HOST}/${PORT}
if [ $? -eq 0 ];then echo "the port $2 is open";else echo "the port $2 is closed";fi

4

หากคุณต้องการใช้ncแต่ไม่มีเวอร์ชันที่รองรับ-zให้ลองใช้--send-only:

nc --send-only <IP> <PORT> </dev/null

และหมดเวลา:

nc -w 1 --send-only <IP> <PORT> </dev/null

และไม่มีการค้นหา DNS หากเป็น IP:

nc -n -w 1 --send-only <IP> <PORT> </dev/null

มันจะส่งคืนรหัส-zตามว่าสามารถเชื่อมต่อได้หรือไม่


1

ฉันเดาว่ามันจะสายเกินไปสำหรับคำตอบและนี่อาจไม่ใช่สิ่งที่ดี แต่ที่นี่คุณไป ...

สิ่งที่เกี่ยวกับการวางไว้ในขณะที่วนกับจับเวลาในบางประเภท ฉันเป็นผู้ชาย Perl มากกว่า Solaris แต่ขึ้นอยู่กับเปลือกหอยที่คุณใช้คุณควรทำสิ่งต่อไปนี้:

TIME = 'date +%s' + 15
while TIME != `date +%s'
do whatever

จากนั้นเพียงแค่เพิ่มการตั้งค่าสถานะในขณะที่วงเพื่อที่ว่าถ้ามันหมดเวลาก่อนที่จะเสร็จสิ้นคุณสามารถอ้างถึงการหมดเวลาเป็นเหตุผลสำหรับความล้มเหลว

ฉันสงสัยว่า telnet มีการสลับการหมดเวลาเช่นกัน แต่จากส่วนหัวของฉันฉันคิดว่าข้างต้นจะได้ผล


1

ฉันต้องการสคริปต์สั้น ๆ ซึ่งทำงานเป็น cron และยังไม่ออก ฉันแก้ปัญหาโดยใช้ nmap

open=`nmap -p $PORT $SERVER | grep "$PORT" | grep open`
if [ -z "$open" ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

หากต้องการเรียกใช้คุณควรติดตั้ง nmap เนื่องจากไม่ใช่แพ็คเกจเริ่มต้นที่ติดตั้งไว้


nmapเอาต์พุต grepable ของอาจเป็นประโยชน์-oG -ในการส่งไปยัง stdout (grep ต้องการการแก้ไขเล็กน้อย)
Gert van den Berg

0

วิธีนี้ใช้ telnet อยู่เบื้องหลังและดูเหมือนว่าจะทำงานได้ดีบน mac / linux มันไม่ได้ใช้ netcat เพราะความแตกต่างระหว่างรุ่นบน linux / mac และใช้งานได้กับการติดตั้ง mac เริ่มต้น

ตัวอย่าง:

$ is_port_open.sh 80 google.com
OPEN

$ is_port_open.sh 8080 google.com
CLOSED

is_port_open.sh

PORT=$1
HOST=$2
TIMEOUT_IN_SEC=${3:-1}
VALUE_IF_OPEN=${4:-"OPEN"}
VALUE_IF_CLOSED=${5:-"CLOSED"}

function eztern()
{
  if [ "$1" == "$2" ]
  then
    echo $3
  else
    echo $4
  fi
}

# cross platform timeout util to support mac mostly
# https://gist.github.com/jaytaylor/6527607
function eztimeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }

function testPort()
{
  OPTS=""

  # find out if port is open using telnet
  # by saving telnet output to temporary file
  # and looking for "Escape character" response
  # from telnet
  FILENAME="/tmp/__port_check_$(uuidgen)"
  RESULT=$(eztimeout $TIMEOUT_IN_SEC telnet $HOST $PORT &> $FILENAME; cat $FILENAME | tail -n1)
  rm -f $FILENAME;
  SUCCESS=$(eztern "$RESULT" "Escape character is '^]'." "$VALUE_IF_OPEN" "$VALUE_IF_CLOSED")

  echo "$SUCCESS"
}

testPort 

0

จากคำตอบที่ได้รับการโหวตมากที่สุดนี่คือฟังก์ชั่นเพื่อรอให้พอร์ตสองพอร์ตเปิดใช้งานและหมดเวลาเช่นกัน โปรดสังเกตว่าพอร์ตสองพอร์ตที่เปิดอยู่คือ 8890 และ 1111 รวมถึง max_attempts (1 ต่อวินาที)

function wait_for_server_to_boot()
{
    echo "Waiting for server to boot up..."
    attempts=0
    max_attempts=30
    while ( nc 127.0.0.1 8890 < /dev/null || nc 127.0.0.1 1111 < /dev/null )  && [[ $attempts < $max_attempts ]] ; do
        attempts=$((attempts+1))
        sleep 1;
        echo "waiting... (${attempts}/${max_attempts})"
    done
}

-1

nmap-ncat เพื่อทดสอบพอร์ตท้องถิ่นที่ไม่ได้ใช้งาน


availabletobindon() {
  port="$1"
  nc -w 2 -i 1 localhost "$port" 2>&1 | grep -v -q 'Idle timeout expired'
  return "$?"
}

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