/ dev / tcp सुनें nc सुनने के बजाय


39

नेटकट श्रोता जैसे:

nc -l <port> < ~/.bashrc

मैं अपने .bashrc को एक नई मशीन पर ले जा सकता हूं (जिसमें ncया LDAP नहीं है ):

cat < /dev/tcp/<ip>/<port> > ~/.bashrc

मेरा प्रश्न है: क्या nc -l <port>मेरी पहली पंक्ति में / dev / tcp के बजाय क्षमताओं की नकल करने का कोई तरीका है nc?

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


सॉकेट को खुला रखने के लिए एक पायथन स्क्रिप्ट लिखने से कम क्या इसे पूरा करने का एक आसान तरीका है?
h3rrmiller

जवाबों:


23

यदि पर्ल स्थापित है (जैसा कि आरएचईएल मशीन पर होगा):

perl -MIO::Socket::INET -ne 'BEGIN{$l=IO::Socket::INET->new(
  LocalPort=>1234,Proto=>"tcp",Listen=>5,ReuseAddr=>1);
  $l=$l->accept}print $l $_' < ~/.bashrc

जब तक एक स्थानीय फ़ायरवॉल 1234 के लिए आने वाले कनेक्शन की अनुमति नहीं देता है, तब तक काम करेगा।

यदि समाज स्थापित है:

socat -u - tcp-listen:1234,reuseaddr < ~/.bashrc

यदि zsh स्थापित है:

zmodload zsh/net/tcp
ztcp -ld3 1234 && # start listening socket on fd 3
  ztcp -ad4 3 && # accept connection on fd 4
  ztcp -c 3 && # close the listening socket that is no longer needed
  cat < ~/.bashrc >&4 && # send the data
  ztcp -c 4 # close the communication socket to tell the other end we're finished

क्या अंतिम ztcp -c 4आदेश 3 नहीं पढ़ा जाना चाहिए ? अन्यथा महान जानकारी, महान टिप।
दिज्जा

@dezza, देखें संपादित करें। Fd 3 पर सॉकेट वास्तव में बंद नहीं किया जा रहा था (हालांकि यह तब होता है जब स्क्रिप्ट समाप्त हो जाती है)। हमें fd 4 पर सॉकेट बंद करने की आवश्यकता है ताकि दूसरे छोर को ईओएफ मिले।
स्टीफन चेजालस

42

दुर्भाग्य से सिर्फ बैश के साथ ऐसा करना असंभव है। /dev/tcp/<ip>/<port>वर्चुअल फ़ाइलों को उस तरीके से कार्यान्वित किया जाता है जो बैश निर्दिष्ट फ़ंक्शन <ip>:<port>का उपयोग करने के लिए कनेक्ट करने का प्रयास करता है connect(2)। सुनने वाले सॉकेट बनाने के लिए, इसे bind(2)फ़ंक्शन को कॉल करना होगा ।

आप bashसूत्रों को डाउनलोड करके और इसे देखकर इसकी जांच कर सकते हैं । इसे फंक्शन (या _netopen6, जो IPv6 भी सपोर्ट करता है) में lib/sh/netopen.cफाइल में लागू किया गया है _netopen4। इस फ़ंक्शन का उपयोग netopenउसी फ़ाइल से आवरण फ़ंक्शन द्वारा किया जाता है , जो इस वर्चुअल रीडायरेक्शन को लागू करने के लिए सीधे फ़ाइल redir.c( redir_special_openफ़ंक्शन) में उपयोग किया जाता है ।

आपको कुछ अन्य एप्लिकेशन ढूंढने होंगे जो आपकी मशीन पर सुनने वाला सॉकेट बना सकते हैं।


+1 bash क्लाइंट सॉकेट बनाने की अनुमति देता है, लेकिन सर्वर सॉकेट जिसे आप nc का उपयोग कर सकते हैं या पर्ल या c के साथ कार्यान्वित किया जा सकता है, वास्तव में सर्वर प्रक्रिया कनेक्शन स्वीकार करने और प्रक्रियाओं को चमकाने या थ्रेड्स बनाने के लिए लूप करेगी या यह केवल एक कनेक्शन को एक से स्वीकार कर सकती है
नहुएल फौलीउल

2
@ नाहुएलफौइलुल: यह पूरी तरह से सही नहीं है। आप बहुत सारे क्लाइंट को केवल एक थ्रेड / प्रोसेस के साथ तथाकथित "अतुल्यकालिक" या "इवेंट संचालित" नेटवर्क प्रोग्रामिंग (चुनिंदा के लिए googling (फ़ंक्शन और नेटवर्क प्रोग्रामिंग में इसका उपयोग कैसे किया जा सकता है) का उपयोग करके संसाधित कर सकते हैं। कई मामलों में यह बहुत अधिक ग्राहकों को स्वीकार करने का बेहतर (तेज) तरीका है।
Krzysztof Adamski

धन्यवाद मैं इस समाधान के बावजूद नहीं था
Nahuel Fouilleul

4
यह वही है जो xinetd के लिए है। यह सुनता है, और किसी भी आने वाले कनेक्शन के लिए आपकी मनमानी प्रक्रिया / स्क्रिप्ट को जन्म देता है। इसके साथ, कुछ भी टीसीपी / आईपी सर्वर बन सकता है।
Evi1M4chine

0

सुनने का कोई तरीका नहीं है क्योंकि सुनने में आघात नहीं है क्योंकि एडम्स्की ने बताया।

लेकिन आपको क्लाइंट पर सुनने की आवश्यकता नहीं है, इसलिए आपको फ़ाइलों को स्थानांतरित करने के लिए क्लाइंट पर नेटकैट की आवश्यकता नहीं है, उदाहरण के लिए:

## To send a file to the locked down computer: 
 ## Local server where you do have netcat 
cat ~/.bashrc | nc -l -q 1 -p 8998

 ## Remote locked down computer without netcat
cat < /dev/tcp/local.server.ip.addr/8998 > latest.bashrc 

## To grab a file from the locked down computer: 
 ## First - on the local server run 
nc -l -p 8998 -q 1 > remote.bashrc < /dev/null 

 ## Then on the locked down computer run: 
cat ~/.bashrc > /dev/tcp/local.server.ip.addr/8998 0<&1 2>&1

-3

आप ऐसा कर सकते हैं, जैसा कि आपने कहा, पूछ / देव / टीसीपी, बैश के साथ:

</dev/tcp/host/port

अगर यह तुरंत चलता है, तो यह सुन रहा है, या तो यह समय समाप्त हो गया है


4
नहीं, आपने निश्चित रूप से इसका परीक्षण नहीं किया है और यदि आपने किया है तो आपको परिणाम नहीं समझना चाहिए। आपका सुझाव सॉकेट खोलना (सुनना नहीं) और आपके द्वारा चलाए गए कमांड में पुनर्निर्देशित करेगा। एक सही उत्तर पहले से ही मिल गया है (लगभग 6 साल पहले ...) इसलिए मुझे यकीन नहीं है कि आपने इस प्रश्न को क्यों चुना है।
h3rrmiller
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.