जब स्टड बंद हो जाता है तो netcat समाप्त नहीं होता है


12

मैं के माध्यम से एक संदेश भेजने की कोशिश कर रहा हूँ netcat। संदेश भेजने के बाद, netcatसमाप्त करना होगा।

मैंने निम्नलिखित कोशिश की है:

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin

-qविकल्प कहता है:

-q सेकंड

स्टड पर ईओएफ के बाद, सेकंड की निर्दिष्ट संख्या की प्रतीक्षा करें और फिर छोड़ दें। यदि सेकंड नकारात्मक है, तो हमेशा के लिए प्रतीक्षा करें।

परंतु

nc -q0 -u localhost 4300 < message.bin

यह भी काम नहीं करता है।

मैं क्या खो रहा हूँ?

जवाबों:


7

यह मानते हुए कि ईओएफ कनेक्शन भेजने के बाद निष्क्रिय रहेगा, आप -w timeoutविकल्प का उपयोग कर सकते हैं , जो timeoutशून्य के बराबर होने के लिए काम करता है (बेवकूफ -qविकल्प के विपरीत ...)

cat tsmmessage.bin | nc -u localhost 4300 -w0

1
यह सही उत्तर है और इसके बजाय स्वीकार किया जाना चाहिए -q
ccpizza 18

1
शून्य समय मेरी मशीन (डेबियन खिंचाव) पर काम नहीं करता है। यह कहता हैinvalid wait-time 0
Anubis

3

-qझंडे के बिना आपका उदाहरण netcatहमेशा के लिए इंतजार करेगा। यूडीपी के साथ "स्ट्रीम का अंत" संदेश नहीं है, इसलिए यह netcatजानने का कोई तरीका नहीं है कि स्टडिन और नेटवर्क कनेक्शन दोनों समाप्त हो गए हैं।

उदाहरण के लिए, टीसीपी / आईपी के उपयोग से यह उम्मीद के मुताबिक काम करता है:

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

लेकिन जैसा कि आपने निर्धारित किया है, यूडीपी / आईपी के उपयोग से यह कभी समाप्त नहीं होता है:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

यह वह जगह है जहाँ -qझंडा आता है। लेकिन दुर्भाग्य से यह मान नहीं लेता है 0। यह गैर-पूर्णांक मानों को भी स्वीकार नहीं करेगा। यहाँ सबसे अच्छा विकल्प है जो मैं बिना timeoutकिसी अन्य बाहरी उपयोगिता के संभोग की पेशकश कर सकता हूं :

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

यहां तक, सुनने के netcatसमय को इनायत से रखना संभव नहीं है । ( -wटाइमआउट विकल्प को नजरअंदाज कर दिया गया है, और -qअप्रासंगिक है।) कुछ इस तरह से व्यावहारिक स्थिति में उपयोग किया जा सकता है, ताकि netcat90 सेकंड के बाद मार दिया जाए :

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

-q 0मेरे लिये कार्य करता है।
एलिकएल्ज़िन-किलाका

@ AlikElzin-kilaka मेरे लिए हालांकि काम नहीं करता है। आप निश्चित रूप से अपने परीक्षणों में यूडीपी का उपयोग कर रहे हैं? आपके पास नेटकाट का कौन सा संस्करण है? आप शायद अधिक हाल के संस्करण पर हैं।
रोइमा

0

यूडीपी

# listen on receiver
nc -u -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300

टीसीपी

# listen on receiver
nc -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -N localhost 4300

डाउनवोट्स क्यों? -N विकल्प इस समस्या को हल करता है
camelccc

-1

जब बहुत अधिक एक ही समस्या के बारे में Googling इस पर ठोकर खाई। यह मुद्दा निकला कि सभी डेटा को चूसा जाने के बाद नेटकैट सही तरीके से बैश हो गया, जिससे प्रतिक्रिया प्राप्त करने का कोई मौका नहीं मिला।

इसका समाधान डेटा को पाइप करने के बाद कुछ विलंब जोड़ना था, जैसे:

(echo INFO; sleep 1) | nc redis.service.consul 6379

एक फ़ाइल के साथ यह दिख सकता है:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300

netcatअभी भी जब sleepखत्म नहीं होता है। मुझे उम्मीद है कि पहली कमांड लाइन 1 सेकंड के बाद प्रॉम्प्ट पर वापस आ जाएगी, लेकिन ऐसा नहीं है।
फ्रैंक केल्स

कैसे जोड़ रहा है -q 1? यानी (echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379?
स्काईवॉटर

साथ -qसब कुछ काम करता है, अपने मूल प्रश्न में भी उदाहरण। मैं तब से उबंटू के एक नए संस्करण में चला गया हूं, शायद यही अंतर पैदा करता है।
फ्रैंक क्लेन्स

वह अजीब है। वैसे भी, खुशी है कि हम दोनों को इस के आसपास एक रास्ता मिला :)
SkyWriter
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.