क्या लिनक्स में टीसीपी सुरंग को विशेष चरित्र डिवाइस के रूप में उजागर करना संभव है?


10

हाल ही में मैंने QNX प्रलेखन में पाया कि यह धारावाहिक डिवाइस ( dev/serX) का उपयोग करके अलग-अलग भौतिक मशीनों पर प्रक्रियाओं के बीच संदेश आधारित आईपीसी स्थापित करने की अनुमति देता है और इससे मुझे आश्चर्य हुआ:

क्या लिनक्स में टीसीपी / यूडीपी सुरंग के लिए सिस्टम-वाइड विशेष उपकरण बनाना संभव है? ncStdin / stdout जैसा कुछ सार्वजनिक रूप से / dev / कुछ के तहत उजागर हुआ।

अंत में मैं एक मशीन पर ऐसी फ़ाइल के लिए कुछ लिखना और उदाहरण के लिए दूसरे छोर पर प्राप्त करना चाहूंगा:

#machine1:
echo "Hello" > /dev/somedev

#machine2:
cat < /dev/somedev

मैंने ncआदमी पर एक नज़र डाली, लेकिन मुझे io स्रोत / गंतव्य को छोड़कर अन्य कोई विकल्प नहीं मिला।



1
माननीय उल्लेख: ट्यून / टैप डिवाइस को / dev में बनाया जा सकता है, लेकिन आपको उन पर IP इनकैप्सुलेशन करना होगा। कुछ उद्देश्यों के लिए अत्यंत उपयोगी।
pjc50

जवाबों:


19

socat "धारा" जैसी दिखने वाली चीजों के साथ ऐसा कर सकते हैं

इस मूल विचार का उपयोग करने वाले को आपके लिए यह करना चाहिए:

Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave

Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321

( उदाहरण पृष्ठ से अनुकूलित )

आप एन्क्रिप्ट करना चाहते हैं, तो आप की भिन्नता इस्तेमाल कर सकते हैं ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,forkजैसे machine1 पर, और कुछ ssl:server-host:1443,cert=client.pem,cafile=server.crtmachine2 पर

( सोसैट ssl के बारे में अधिक )


7

संदेश-पारित करने की आवश्यकता को एक उच्च स्तर पर लागू किया जाना चाहिए; टीसीपी में एक संदेश की धारणा नहीं है - टीसीपी कनेक्शन ऑक्टेट की धाराएं स्थानांतरित करता है।

आप कुछ प्रकार प्राप्त कर सकते हैं, जैसे कि आप पाइपों के साथ क्या अनुरोध करते हैं ncऔर देखें ; या एलेक्स स्ट्रैजी इंगित करता है के रूप में जाँच करें ।man mkfifosocat

एक मध्य-परत सेवा के बिना, मूल समस्याएं हैं (1) वह डेटा नेटवर्क में नहीं लिखा जा सकता है जब तक कि कोई दूसरा इसके लिए सुनने वाला न हो, और (2) कि टीसीपी कनेक्शन द्वि-दिशात्मक हैं।

जब तक आप नेटवर्क को डेटा नहीं लिख सकते जब तक कि कोई इसके लिए नहीं सुन रहा है, आपको डेटा भेजने से पहले श्रोता को हमेशा शुरू करना चाहिए । (एक संदेश पासिंग सिस्टम में संदेशों को संभालने की प्रक्रिया किसी प्रकार की बफरिंग प्रदान करेगी।)

आपका उदाहरण आसानी से लिखा जा सकता है:

  • पहले मशीन 2 (गंतव्य) पर एक श्रोता शुरू करें:

     nc -l 1234 | ...some processing with the received data...
    

    आपके उदाहरण में, यह होगा

     nc -l 1234 | cat
    

    यह ब्लॉक करेगा और किसी को 1234 पोर्ट के लिए कुछ डेटा भेजने के लिए इंतजार करेगा।

  • तब आप मशीन 1 (स्रोत) से कुछ डेटा भेज सकते हैं:

    ...make up some data... | nc machine2 1234
    

    आपके उदाहरण में, यह होगा

     echo "Hello" | nc machine2 1234
    

यदि आप प्राप्त डेटा को किसी तरह से संसाधित करना चाहते हैं और जवाब देना चाहते हैं तो आप शेल के कोप्रोसेसिंग सुविधा का उपयोग कर सकते हैं। उदाहरण के लिए, यह एक बहुत ही सरल (और बहुत जिद्दी) वेब सर्वर है:

#! /bin/bash

while :; do
  coproc ncfd { nc -l 1234; }
  while :; do
    read line <&${ncfd[0]} || break
    line="$(
      echo "$line" |
      LC_ALL=C tr -cd ' -~'
    )"
    echo >&2 "Received: \"$line\""
    if [ "$line" = "" ]; then
      echo >&${ncfd[1]} "HTTP/1.0 200 OK"
      echo >&${ncfd[1]} "Content-Type: text/html"
      echo >&${ncfd[1]} "Connection: close"
      echo >&${ncfd[1]} ""
      echo >&${ncfd[1]} "<title>It works!</title>"
      echo >&${ncfd[1]} "<center><b>It works!</b></center>"
      echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
      break
    fi
  done
  kill %%
  sleep 0.1
done

देखें कि द्वि-दिशात्मक संचार कैसे स्क्रिप्ट के मुख्य निकाय और सरणी में फ़ाइल डिस्क्रिप्टर का उपयोग करके कॉपीप्रोसेस के बीच प्राप्त किया जाता है $ncfd


आप सही हैं, और मैंने उत्तर में स्वीकार किया है। किसी प्रकार के मध्यस्थ सॉफ्टवेयर के बिना एक वर्ण उपकरण नहीं हो सकता।
एलेक्सा डे

लगता है कि आपके पास वहां UUOC है।
माइकल हैम्पटन

1
@ मिचेल हैम्पटन: यह ओपी द्वारा प्रदान किया गया उदाहरण था। मुझे लगता है कि cat"कुछ प्रक्रिया पढ़ने के लिए खड़ा है"।
एलेक्सपी

5

यदि आप मूल रूप से nc जैसे बेसिक प्रोग्राम का उपयोग करके दो कंप्यूटरों को कनेक्ट करना चाहते हैं, तो आप इससे / से रीडायरेक्ट कर सकते हैं /dev/tcp/<host>/<port>

ये वास्तविक डिवाइस cat /dev/tcp/foo/19नहीं हैं, लेकिन बैश द्वारा बनाई गई एक कल्पना है, इसलिए ऐसी चीजें काम नहीं करेंगी, लेकिन cat < /dev/tcp/foo/19करेंगे।

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