ฉันกำลังรันคำสั่งต่อไปนี้จากสคริปต์:
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat localhost 8001
อย่างไรก็ตามไคลเอ็นต์ netcat ยังคงเปิดอยู่เรื่อย ๆ ฉันจะปิดการเชื่อมต่อได้อย่างไรเมื่อข้อมูลนี้ถูกส่งไปแล้ว?
ฉันกำลังรันคำสั่งต่อไปนี้จากสคริปต์:
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat localhost 8001
อย่างไรก็ตามไคลเอ็นต์ netcat ยังคงเปิดอยู่เรื่อย ๆ ฉันจะปิดการเชื่อมต่อได้อย่างไรเมื่อข้อมูลนี้ถูกส่งไปแล้ว?
คำตอบ:
ทั้งคำตอบอื่น ๆ-c
และคำตอบที่-q
ได้รับนั้นถูกต้องในบริบทที่ถูกต้อง แต่อาจช่วยสรุปได้ว่าทำไมมีคำตอบหลายข้อและให้คำตอบทั่วไปมากกว่า
ตัวเลือกต่าง ๆ เหล่านี้ทำสิ่งเดียวกัน แต่เป็นการใช้งานที่แตกต่างกันของ netcat:
-c
การใช้งาน netcat ของ GNU-q
การใช้งาน OpenBSD ของ netcat -w
(อื่น ๆ ?) การใช้งาน OpenBSD ของ netcat บางรุ่นจำเป็นต้องมี int เพื่อระบุจำนวนวินาทีที่จะรอก่อนที่จะเลิกใช้ตัวเลือก-q
และ -w
int นี้จะต้องเป็น> 0
หรือ>= 0
ขึ้นอยู่กับรุ่น
หากคุณกำลังใช้งานบางอย่างกับหลาย ๆ เครื่องและไม่แน่ใจว่าพวกเขาใช้การใช้งาน netcat แบบเดียวกันคุณอาจลองตัดการเรียก netcat ของคุณด้วยtimeout
โปรแกรมเพื่อฆ่า netcat หลังจากนั้นไม่กี่วินาที
timeout 5 echo '{"hostUp": true}' | netcat localhost 8001
วิธีนี้ค่อนข้างงุ่มง่ามเพราะมันทำให้ขีด จำกัด บนการดำเนินการของ netcat ไม่ว่าจะส่งข้อมูลสำเร็จหรือไม่ แต่ถ้าคุณกำลังส่งข้อมูลจำนวนเล็กน้อยและมีเวลาไม่กี่วินาทีในการสำรอง กับการใช้งาน netcat ใด ๆ
คุณสามารถใช้-q
พารามิเตอร์ แต่มันจะทำให้netcat
เซิร์ฟเวอร์ถูกปิดด้วย
$ echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -q 5 localhost 8001
ในกรณีของฉันสำเนาของ netcat ที่ฉันใช้บน Mac ของฉันติดตั้งผ่าน Homebrew (v 0.7.1) ไม่มีตัวเลือก -q แต่ฉันสามารถใช้ตัวเลือก -c เพื่อปิด STDIN EOF และวาง คำสั่งทั้งหมดในลูป:
while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
บนเซิร์ฟเวอร์ Ubuntu 18.04 ฉันต้องใช้สิ่งต่อไปนี้: (พบได้ใน man pages)
echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -N localhost 8001
เห็นได้ชัดว่า-N
มีความคล้ายคลึงกับ-q
หรือ-c
ใน distros อื่น ๆ