Netcat के साथ केवल एक UDP पैकेट कैसे भेजें?


121

मैं एक यूडीपी पैकेट में केवल एक छोटा मूल्य भेजना चाहता हूं, लेकिन कमांड चलाना

echo -n "hello" | nc -4u localhost 8000

मैं देख सकता हूं कि सर्वर को हैलो सामान मिल रहा है लेकिन मुझे Ctrl+ दबाना होगाc netcat कमांड को छोड़ने के लिए ।

हैलो भेजने के बाद मैं इसे कैसे छोड़ सकता हूं ?


क्षमा करें, शोर के लिए, मैंने मैन पेज को फिर से पढ़ा और -qविकल्प पाया ।

 echo -n "hello" | nc -4u -q1 localhost 8000

काम करता है (यह 1 सेकंड के बाद क्विट करता है)।

किसी कारण से यह साथ काम नहीं करता है -q0


मैन पेज ऑन डेबियन:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
सौभाग्यवती

जवाबों:


204

यदि आप बैश का उपयोग कर रहे हैं, तो आप भी लिख सकते हैं

echo -n "hello" >/dev/udp/localhost/8000

और netcat की सभी अज्ञातताओं और विसंगतियों से बचें।

यह अन्य होस्ट को भी भेजने का काम करता है, पूर्व:

echo -n "hello" >/dev/udp/remotehost/8000

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


24
ठीक है, आप सही हैं, मुझे यह स्पष्ट करना चाहिए कि यह ZSH के साथ काम नहीं करेगा।
jturolla

1
यह नेटकैट के साथ मिलिंग से बेहतर है। पारितोषिक के लिए धन्यवाद!
जॉनबोइल

3
यह सबसे आश्चर्यजनक बात हो सकती है जिसे मैंने कभी देखा है।
फ़्रीब

4
किसी कारण से, मुझे 127.0.0.1इसके बजाय localhostUbuntu 14.04 पर उपयोग करने की आवश्यकता थी । (हाँ, मैं क्या ज़रूरत localhostमें /etc/hosts।)
tuomassalo

3
/dev/udp/एक वास्तविक फ़ाइल नहीं है। यह केवल एक फ़ाइल नाम है जिसे विशेष रूप से बैश द्वारा व्याख्या किया गया है।
पीटर आइसेनट्राट

46

मुझे -q1अपने नेटकैट पर विकल्प नहीं मिला । इसके बजाय मैंने -w1विकल्प का इस्तेमाल किया । नीचे बश स्क्रिप्ट है जो मैंने किसी होस्ट और पोर्ट को udp पैकेट भेजने के लिए की थी:

#!/bin/bash

def_host=localhost
def_port=43211

HOST=${2:-$def_host}
PORT=${3:-$def_port}

echo -n "$1" | nc -4u -w1 $HOST $PORT

ओएस एक्स यह काम करता है: "इको-एन" टेस्ट "। nc -4u -w0 लोकलहोस्ट 9999" के रूप में साइमनडब्ल्यू कहते हैं
साइमन

14

वर्तमान नेटकैट (v0.7.1) पर आपके पास एक -c स्विच है:

-c, --close                close connection on EOF from stdin

अत,

echo "hi" | nc -cu localhost 8000

चाल चलनी चाहिए।


3
यह नोट करना महत्वपूर्ण है कि यह केवल GNU netcat के लिए सही है, लेकिन BSD netcat के लिए नहीं।
मारसॉफ्ट

स्पष्टता के लिए, लिनक्स-आधारित नेटकैट के साथ, -c विकल्प के लिए एक तर्क के रूप में एक कमांड की आवश्यकता होती है, जो "दिए गए तर्क को / बिन / बैश के माध्यम से निष्पादित करता है" - कमांडलिनक्स.com
ब्लेक नील

5

Netcat एक पैकेट प्रति नईलाइन भेजता है। तो तुम ठीक हो। यदि आप कुछ अधिक जटिल करते हैं तो आपको कुछ और की आवश्यकता हो सकती है।

जब मुझे इस बात का अहसास हुआ तो मैं विंडसर के साथ बेवकूफ बना रहा था। पता नहीं अगर यह मदद करता है।


3
मुझे लगता है कि यह केवल टीसीपी के लिए सही है। यूडीपी के साथ, यह एक पैकेट में कई लाइनें भेजेगा (यदि वे फिट होते हैं)।
सिल्के

1
नहीं, बस परीक्षण करें echo -n "hello\nworld" >/dev/udp/localhost/514और आपको
बजे

5

मुझे एक ही समस्या थी लेकिन मैं -w 0केवल एक पैकेट भेजने और छोड़ने के लिए विकल्प का उपयोग करता हूं । आपको इस कमांड का उपयोग करना चाहिए:

echo -n "hello" | nc -4u -w0 localhost 8000

nc 1.10-41 + b1 स्वीकार नहीं करता है -w0। त्रुटि: अमान्य प्रतीक्षा-समय ०
पालिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.