Netcat / पाइपिंग और यूडीपी के साथ सामाजिक व्यवहार?


16

मुझे लगता है कि यह linux के करीब है - Netcat UDP ट्रैफ़िक के लिए सुनना बंद कर देता है - सुपर उपयोगकर्ता , लेकिन मैंने सोचा कि मैं किसी भी रास्ते से पूछना चाहता हूं

नेटकाट के संस्करणों में जहां तक मैं उबंटू 11.04 और उस netcatपर डिफ़ॉल्ट का उपयोग कर रहा हूं , जिसका मैं अनुमान लगा रहा हूं openbsd:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

यह वह है जो मुझे अजीब लगता है: पहला मामला उम्मीद के मुताबिक काम करता है - मैं एक टर्मिनल में एक यूडीपी सर्वर खोलता हूं:

$ sudo nc -ul 5000

... और एक अन्य टर्मिनल में मैं एक नया यूडीपी क्लाइंट कनेक्शन शुरू करता हूं - और मैं helloतीन बार टाइप करता हूं , प्रत्येक के बाद ENTER दबाता हूं :

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... और सर्वर टर्मिनल पर वापस जा रहा है, यह helloतीन बार मुद्रित किया गया है, जैसा कि अपेक्षित है:

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

अब तक बहुत अच्छा, सभी उम्मीद के मुताबिक काम करते हैं। हालाँकि, मान लीजिए कि मैं क्लाइंट में इनपुट पाइपिंग द्वारा समान कोशिश करता हूं; इसलिए पहले टर्मिनल में एक UDP सर्वर स्थापित करें:

$ sudo nc -ul 5000

... और दूसरे में, ncUDP क्लाइंट के रूप में कुछ डेटा को पाइप करें:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... क्लाइंट कमांड के बाद, शेल की तरह फ्रीज होता है जैसे कि इनपुट का इंतजार कर रहा है - इसलिए मैं helloदो बार और टाइप करता हूं ; लेकिन सर्वर ने केवल पहला पंजीकृत किया है hello(जो कि इसके माध्यम से पाइप किया गया था echo)। इसके अलावा, यहां तक ​​कि अगर आप Ctrl-C दबाते हैं, और क्लाइंट echo hello | nc -u 127.0.0.1 5000कमांड को दोहराने की कोशिश करते हैं , तो सर्वर अभी भी बहुत पहले रिपोर्ट किया जाएगा hello:

$ sudo nc -ul 57130 
hello
^C

... और केवल Ctrl-C के साथ सर्वर को रोकने और इसे फिर से शुरू करने के बाद, ग्राहक echo hello | nc -u 127.0.0.1 5000आदेश को दोहरा सकता है और इसे काम कर सकता है।

 

क्या यह तरीका ncव्यवहार करने वाला है? मुझे उम्मीद है कि कम से कम बार-बार कॉल करने के echo hello | nc -u 127.0.0.1 5000लिए पंजीकृत किया जाएगा - सर्वर को पुनरारंभ किए बिना? या शायद उस तरह के व्यवहार के लिए एक विशेष कमांड-लाइन स्विच है?

संपादित करें: मुझे यह अच्छी पीडीएफ प्रस्तुति मिली: समाज - सभी प्रकार के सॉकेट्स को संभालना , जिसमें निम्नलिखित netcatबनाम socatनोट शामिल हैं:

netcat - सीमाएँ
● केवल एक शॉट (सॉकेट बंद होने के बाद समाप्त होता है)
...
उदाहरण 1: netcat रिप्लेसमेंट
...
● UDP क्लाइंट सोर्स पोर्ट के साथ:
nc -u 500 1.2.3.4 500
समाज - udp: 1.2.3.4: 500, sp = 500
● TCP सर्वर:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...

... हालाँकि, मैं ऊपर के समान व्यवहार कर रहा हूं, अगर मैं सर्वर कमांड को socat - udp4-listen:5000,reuseaddr"-" और क्लाइंट लाइन को " socat - udp:127.0.0.1:5000" ... पाइप्ड इनपुट के साथ, " echo hello | socat - udp:127.0.0.1:5000" के साथ बदल देता हूं, तो एकमात्र अंतर यह है कि यहाँ शब्द helloभेजे जाने के बाद कमांड कम से कम मौजूद है - हालाँकि, फिर से, इस कमांड के लगातार रन सर्वर पर किसी भी रिसेप्शन का कारण नहीं होगा, जब तक कि सर्वर को फिर से शुरू नहीं किया जाता है।

जवाबों:


23

ठीक है, मुझे लगता है कि कम से कम मुझे कुछ मिला socat- अर्थात्, विकल्प forkको सर्वर लाइन से जोड़ा जाना चाहिए:

$ socat - udp4-listen:5000,reuseaddr,fork

... और फिर, दूसरे टर्मिनल में, हम कमांड लाइन पर कई बार क्लाइंट लाइन echoमें पाइपिंग को कॉल कर सकते हैं socat, क्योंकि यह तुरंत बाहर निकल जाएगा ( अच्छी तरह से, आधे सेकंड के बाद :) ):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... और पहले टर्मिनल पर वापस जा रहे हैं, हम देख सकते हैं कि सर्वर ने सभी तीनों को सफलतापूर्वक दिखाया है hello:

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

ध्यान दें कि एक fork-ed socatसर्वर के साथ, लाइन echo "hello" | nc -u 127.0.0.1 5000अभी भी 'लॉक' होगी जैसे कि उपयोगकर्ता इनपुट की प्रतीक्षा कर रही है; हालाँकि, अब Ctrl-C के बाद और कमांड को फिर से चलाना, अर्थात

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... fork-ed socatसर्वर तीन helloएस दिखाएगा फिर से शुरू किए जाने की आवश्यकता के बिना ।।

 

लगता है, इस OpenBSD के netcatपास कोई forkविकल्प नहीं है - लेकिन मुझे यकीन नहीं है कि अगर यह एक है जो इसके अनुरूप है ..

वैसे भी, उम्मीद है कि यह किसी को मदद करता है,
चीयर्स!


4

जब आप पाइप का उपयोग करते हैं तो आपका नेटकैट केवल इको के स्टडआउट से आउटपुट पढ़ रहा है, यह अब कीबोर्ड से "कनेक्ट" नहीं है। आप जिस प्रतिक्रिया की उम्मीद कर रहे हैं, उसे पाने के लिए, आप अपने तीन "हैलो" की फाइल को रन में जोड़ सकते हैं

cat [myfile] | nc -u 127.0.0.1 5000

हाय @ ओल्डवुल्फ - आपके उत्तर के लिए बहुत धन्यवाद! मैंने आपके सुझाव की कोशिश की (कुछ हद तक और भी जटिल तरीके से, " cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000"), हालांकि, जब मैं तीन helloएस देखता हूं, तो मुझे कौन सी पहेलियां अभी भी मौजूद हैं: वह आदेश भी "लॉक" की तरह होगा, जैसे कि टाइप किए गए इनपुट का इंतजार करना उपयोगकर्ता, और Ctrl-C के बाद और इसे पुनः चालू करने के बाद, सर्वर को पुनः आरंभ होने तक कोई डेटा दिखाई नहीं देगा !? यही तो मैं बेहतर जानना चाहता हूँ - चीयर्स!
20.04 पर sauau

2
nc एक ईओएफ पर प्रतीक्षा कर रहा है, जो इस मामले में, यह तब तक नहीं मिलता है जब तक कि आप प्रोग्राम को निकास संकेत नहीं भेजते हैं।
ओल्डवुल्फ

आह, मैं देख रहा हूँ - उस स्पष्टीकरण के लिए बहुत धन्यवाद, @ ओल्डवुल्फ! पूरी तरह socatसे forkविकल्प के साथ चारों ओर काम कर सकते हैं ... धन्यवाद फिर से, चीयर्स!
सदाउ

3

यदि आप श्रवण एनसी की एक स्ट्रेस करते हैं, तो यह दिखाएगा कि netcat कनेक्शन के लिए इंतजार कर रहा है, और एक बार यह मिल जाता है, उस होस्ट और पोर्ट से जुड़ जाएगा, अन्य सभी को अनदेखा करेगा। आपको चलते रहने के लिए '-k' जोड़ने की जरूरत है और '-w 0' प्रत्येक कनेक्शन को 0 सेकंड के बाद टाइमआउट करने के लिए। मुझे लगता है कि सुकैट एक बेहतर विकल्प है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.