netcat ไม่ตอบสนองการพิมพ์


12

ฉันกำลังพยายามส่งคำสั่งไปยังพอร์ต tcp โดยใช้netcatและการตอบสนองไปป์
เมื่อฉันรันnetcatและพิมพ์คำสั่งของฉันมันพิมพ์การตอบสนองอย่างถูกต้อง แต่เมื่อฉันส่งคำสั่งจากไพพ์มันจะส่งคำสั่งอย่างถูกต้อง แต่ไม่พิมพ์การตอบสนอง

ดังนั้นวิธีนี้ทำงานอย่างถูกต้อง:

netcat  localhost 9009

ขณะนี้เพิ่งส่งคำสั่ง แต่ไม่ตอบสนองการพิมพ์:

echo 'my_command' | netcat  localhost 9009

ทำไม?
ฉันnetcatจะพิมพ์ข้อความตอบกลับได้อย่างไร


สิ่งนี้อาจเกิดขึ้นกับคุณ
Jeff Schaller

@JeffSchaller: ไม่! น่าเสียดายที่การใช้คำสั่งเหล่านั้นไม่ได้ช่วยอะไร! คราวนี้มันปิดกั้นตลอดไป!
RYN

netcat ใดที่คุณใช้อยู่ น่าเสียดายที่มีเครื่องมือ netcat หลายรูปแบบที่แตกต่างกันไปและสิ่งเหล่านี้ก็ไม่ทำงานเหมือนกัน นอกจากนี้ในระยะไกลคืออะไร
แพทริค

@ แพทริก: netcat ของฉันคือOpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)รุ่น; และที่ปลายทางระยะไกลอยู่telegram-cliในเครื่องเดียวกัน
RYN

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

คำตอบ:


8

ดังที่ @Patrick กล่าวว่าปัญหานี้มักจะเกิดขึ้นnetcatก่อนที่จะได้รับคำตอบ คุณแก้ไขได้โดยเพิ่ม-q 2ลงในบรรทัดคำสั่งเช่นบอกnetcatให้แขวนประมาณ 2 วินาทีหลังจากตรวจพบ EOF ในอินพุตมาตรฐาน เห็นได้ชัดว่าคุณสามารถทำให้มันรอจำนวนวินาทีอื่น ๆ เช่นกัน


ขอบคุณ; -q 2ทำงานได้ แต่เชื่อถือได้หรือไม่ มันทำให้การร้องขอทางเว็บฉันไม่แน่ใจว่า 2s จะเพียงพอเสมอ! ให้ฉัน ?
RYN

1
ใช้จำนวนที่มากขึ้นเพื่อให้รอนานขึ้นหรือใช้จำนวนลบเพื่อให้รออย่างไม่มีกำหนด นอกจากนี้ยังมี-wตัวเลือกในการเล่นด้วย นี่คือทั้งหมดในman ncหน้าของหลักสูตร
Ralph Rönnquist

5
มันบอกว่าinvalid option -- 'q'
phil294

ฉันคิดว่าคำถามติดตามที่ดีคือ: เหตุใดจึงncออกทันทีแทนที่จะรอคำตอบ หากการเชื่อมต่อยังคงเปิดอยู่ควรมีตัวเลือกให้ncรอเพื่อปิดไม่ใช่เพื่อให้ stdin สิ้นสุดเท่านั้น
theferrit32

6

ใช้สิ่งนี้:

cat <(echo command) - | nc host port

ปัญหาคือว่าncจะปิดการเชื่อมต่อทันทีหลังจาก stdin ถูกปิดซึ่งรวดเร็วมากสำหรับmy_commandสตริงที่เรียบง่ายและจึงไม่เคยได้รับโอกาสที่จะได้รับการตอบสนอง (หากคุณไพพ์ไฟล์ที่มีขนาดใหญ่มากคุณจะเห็นว่ามันอาจได้รับการตอบกลับก่อนที่มันจะทำการส่งไฟล์)

ป้อนcatด้วย-อาร์กิวเมนต์ที่สอง: ทำให้catฟัง stdin สำหรับเนื้อหาเพิ่มเติมที่จะไพพ์ผ่านหลังจากที่ได้ส่งเนื้อหาของอาร์กิวเมนต์แรก อาร์กิวเมนต์แรกเพิ่งได้echoรับคำสั่งผ่านcat- มันอาจเป็นไฟล์ที่มีคำสั่งของคุณcat < file - | ...ด้วย

หรือทำสิ่งนี้:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

ส่ง#อักขระไม่ จำกัดที่บรรทัดที่ 2 ของอินพุต การใช้#งานสำหรับ bash เช่นระยะไกลที่จะไม่สนใจสิ่งนี้เป็นความคิดเห็น ฉันเลือกเวลารอเล็กน้อย 10 มิลลิวินาทีที่นี่ดังนั้นมันจะตอบสนองเร็วขึ้นเมื่อสิ้นสุดการเชื่อมต่อ YMMV

ข้อเสียของมันอาจเป็นแบบนั้นcatหรือเป็นwhileลูปและncยังคงทำงานต่อไปจนกว่าคุณจะกด^Cหรือ^Dบนเปลือก มันขึ้นอยู่กับปลายทางระยะไกลจริงๆ

การเพิ่มการหมดเวลาโดยใช้-w 1(OSX netcat) หรือ-i 1(ncat ของ nmap) ทำให้การเชื่อมต่อนั้นปิดลงncหลังจากผ่านไป 1 วินาที แต่catจะยังคงทำงานต่อไปจนกว่าคุณจะป้อนตัวละครและตัวแบ่งส่วนแบ่ง (ฉันคิดว่า)

อย่างไรก็ตามมันจะใช้งานได้หากด้านรีโมตจะปิดการเชื่อมต่อโดยอัตโนมัติหลังจากได้รับและจัดการคำสั่งซึ่งจะเป็นการสิ้นสุดncไคลเอ็นต์และกระบวนการไพพ์ลงไป

คำตอบนี้อยู่บนพื้นฐานนี้คำตอบนี้จะเป็นคำถามที่ superuser เหมือนกัน


{ echo my_command; cat;}จะทำแบบเดียวกันและอาจจะเข้าใจได้ง่ายขึ้น
G-Man กล่าวว่า 'Reinstate Monica'

1

ที่แตกต่างกันรุ่น OpenBSD-netcat มีโวหารต้องแตกต่างกันของ-w <seconds>, -q <seconds>, -Nและแม้กระทั่งต้องมีปากเสียงที่แตกต่างกันขึ้นอยู่กับสิ่งที่จะทำงานในส่วนอื่น ๆ ของการเชื่อมต่อ การใช้ตัวเลือกการหมดเวลากับบางรุ่นหรือเซิร์ฟเวอร์อาจทำให้เกิดความล่าช้าและการไม่ใช้ตัวเลือกเหล่านั้นอาจส่งผลให้เกิดความล่าช้า (ไม่สิ้นสุดหรือไม่) นานมาก และฉันคาดหวังว่านิสัยใจคอที่แตกต่างกับ gnu netcat แต่ไม่รู้ว่ามันแตกต่างกันหรือไม่ระหว่างเวอร์ชั่นของมัน

ตัวอย่างเช่นรุ่น 1.130_3 จาก archlinux ใช้เวลานานมาก (ถาวรไหม) เมื่อฉันทำสิ่งนี้:

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

แต่จะทำงานร่วมกับ -N ที่เพิ่มเข้ากับเซิร์ฟเวอร์หรือไคลเอนต์


1

ฉันรู้ว่ามันค่อนข้างเก่า แต่ไม่มีคำตอบอื่นใดที่เหมาะกับฉันและสิ่งนี้ก็ทำได้:

echo 'test' | netcat -N $server $port

สังเกตเห็น-N:

ปิดซ็อกเก็ตเครือข่ายหลังจาก EOF บนอินพุต เซิร์ฟเวอร์บางตัวต้องใช้สิ่งนี้เพื่อทำงานให้เสร็จ

ทำงานให้ฉันทั้งบน Windows และ Linux

หมายเหตุ: นี่คือการวางสำเนาของคำตอบที่ผมโพสต์สำหรับคำถามที่ซ้ำกัน

ฉันคิดว่านี่อาจเป็นประโยชน์ Mods สามารถแก้ไข / ลบได้หากขัดต่อนโยบายหรือบางสิ่ง

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