सॉकेट संदेश भेजने के लिए सरल शेल स्क्रिप्ट


16

परीक्षण उद्देश्यों के लिए मुझे एक शेल स्क्रिप्ट बनाने की आवश्यकता है जो एक दूरस्थ आईपी> पोर्ट से जुड़ती है और एक सरल पाठ टीसीपीआईपी सॉकेट संदेश भेजता है।

जवाबों:


18

का उपयोग कर nc( netcat)।

सर्वर:

$ nc -l localhost 3000

ग्राहक:

$ nc localhost 3000

सर्वर और क्लाइंट दोनों मानक आउटपुट / इनपुट को पढ़ेंगे और लिखेंगे।

यह तब काम करेगा जब सर्वर और क्लाइंट दोनों एक ही मशीन पर हों। अन्यथा localhostसर्वर के बाहरी नाम में परिवर्तन करें।

थोड़ा और अधिक दिलचस्प है, एक "सर्वर" जो आपको दिन का समय देता है यदि आप इसे कनेक्ट करते हैं और इसे भेजते हैं d, और यदि आप भेजते हैं, तो q:

सर्वर (में bash):

#!/bin/bash

coproc nc -l localhost 3000

while read -r cmd; do
  case $cmd in
    d) date ;;
    q) break ;;
    *) echo 'What?'
  esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"

kill "$COPROC_PID"

ग्राहक सत्र:

$ एनसी लोकलहोस्ट 3000
घ
थु जन 12 18:04:21 सीईटी 2017
नमस्कार?
क्या?
क्ष

(सर्वर के बाद बाहर निकलता है q, लेकिन ग्राहक यह पता नहीं लगाता है कि यह तब तक चला है जब तक आप दबाते हैं Enter)।


2
यदि क्लाइंट डेटा भेजना समाप्त करता है, तो सर्वर परिणाम देता है, परिणाम ctrl+cनहीं दिखाएगा। यदि इको का उपयोग किया जाता है, उदाहरण के लिए echo "cookie" | nc localhost 9090, क्लाइंट का आउटपुट स्ट्रीम बंद हो जाएगा (ईओएफ भेजा गया) लेकिन क्लाइंट अभी भी सर्वर के परिणाम का इंतजार करेगा।
एलिकएल्ज़िन-किलाका

12

सामान्य सलाह के साथ netcatबेहतर तरीका है।

लेकिन में bashऔर kshआप यह भी कर सकते हैं:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"

क्या है 1>&3? मुझे यकीन नहीं है कि जो प्रतिनिधित्व करता है
अलेक्जेंडर मिल्स

दूसरे शब्दों में, क्यों नहीं echo "request" >&3, मुझे लगता है कि 1 सिर्फ निरर्थक है
अलेक्जेंडर मिल्स

4

netcat का प्रयास करें (उदा। nc)

echo GET / HTTP/1.0 | nc 0 80
HTTP/1.1 400 Bad Request
Date: Thu, 12 Jan 2017 13:44:23 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 311
Connection: close
Content-Type: text/html; charset=iso-8859-1
  • नमूना में मैं echo GET / HTTP/1.0अपने स्थानीय http सर्वर पर एक GET ( ) भेजता हूं
  • यदि आप जटिल प्रोटोकॉल नहीं चाहते हैं, तो यह काम कर सकता है।

0

कई मामलों में मुझे netcat / socat तक पहुँच नहीं मिली है। मेरे पास execवितरित कंप्यूटिंग वातावरण में बैश का उपयोग करने के मुद्दे भी हैं।

इसकी व्यापकता के कारण, एक वैकल्पिक समाधान GNU AWK की टीसीपी / आईपी क्षमताओं का उपयोग करना है। यह "टू-वे पाइप" ऑपरेटर के आसपास आधारित एक सरल वाक्यविन्यास प्रदान करता है।

इस स्रोत से एक संशोधित उदाहरण यहां दिया गया है जो एक सॉकेट पर एक टीसीपी संदेश भेजेगा:

BEGIN {
 NetService = "/inet/tcp/0/cs.wisc.edu/finger"
 print "coke" |& NetService
 close(NetService)
}

पते के लिए पूर्ण वाक्य रचना है: /net-type/protocol/local-port/remote-host/remote-port। जब local-port0 पर सेट किया जाता है तो स्थानीय होस्ट अपने आप पोर्ट को चुन लेता है जो आमतौर पर आप चाहते हैं। आप के बारे में अधिक पढ़ सकते हैं gawkके टीसीपी / आईपी नेटवर्किंग क्षमताओं यहाँ:

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