कैसे bash द्वारा स्थापित TCP कनेक्शन को समाप्त करना है?


17

मैंने exec 3<>/dev/tcp/192.168.0.101/6435192.168.0.101:6435 के साथ एक टीसीपी कनेक्शन स्थापित करने के लिए उपयोग किया है। और मुझे pipeकमांड के साथ कुछ संदेश भेजे गए हैं ।

अब, मैं टीसीपी कनेक्शन को समाप्त करना चाहता हूं। लेकिन, ss -anpetमैं इस बात को देख सकता हूं कि बच्चे की प्रक्रिया को समझे बिना, बैश खुद ही यह संबंध रखता है।

मैंने बैश प्रक्रिया के लिए सिग्नल 9 और 15 भेजने की कोशिश की, लेकिन जैसा कि आप जानते हैं, बैश खुद को मार नहीं सकता है।

तो, क्या मैं अपने द्वारा उपयोग किए जा रहे पीटीएस को समाप्त किए बिना टीसीपी कनेक्शन को समाप्त कर सकता हूं (न तो इसे रूट से मार रहा हूं और न ही Ctrl + सेंड कर रहा हूं)?


क्या आप एक और शेल प्राप्त कर सकते हैं और bashउस शेल को मार सकते हैं ?
ट्राइनिस जू

3
bashनिश्चित रूप से खुद को मार सकता है - हालांकि यह वास्तव में नहीं है कि आप यहां क्या करना चाहते हैं!
12'16

@TJM इस आकर्षक प्रश्न को दूसरों के लिए अधिक उपयोगी बनाने के लिए, क्या आप कृपया उस pipeकमांड पर विस्तार से बता सकते हैं जिसका आप उपयोग कर रहे हैं और जिसे मैं अपने सिस्टम में नहीं पा सकता हूं? किस पैकेज pipeसे आता है? /dev/tcp/...कनेक्शन पर डेटा भेजने / प्राप्त करने के लिए आप क्या (उदाहरण) पैरामीटर पास कर सकते हैं ? धन्यवाद।
अरीफ

@ रूप में आमतौर पर, मैं कंप्यूटर विज्ञान का आरंभकर्ता हूं, और मुझे इस तरह के उपयोग सेडबॉट नामक बैश शेल स्क्रिप्ट से मिले, आप इसे जीथब पर पा सकते हैं। हां, मुझे कोई भी फाइल नहीं मिल रही है /dev/tcp, यहां तक ​​कि /dev/tcpखुद को भी नहीं खोज सकते । लेकिन, यह एक विशेष उपयोग लगता है जिसे आप pipeइस तरह की फाइलों के साथ डेटा भेज / प्राप्त कर सकते हैं । यह कहा जाता है कि /dev/tcp/ip/porttcp कनेक्शन के लिए, और /dev/udp/ip/portudp पैकेज के लिए उपयोग करें । मेरी अंग्रेजी बहुत अच्छी नहीं है, मुझे नहीं पता कि इसे कैसे ठीक से समझाऊं। कृपया प्रश्न को संपादित करने और उत्तर पोस्ट करने के लिए स्वतंत्र महसूस करें।
TJM

@TJM धन्यवाद सवाल उस pipeकमांड के बारे में था जिसका आप उल्लेख करते हैं। मैंने देखा https://github.com/clsr/sedbot/blob/master/sedbot.bash। वहां कोई pipeआज्ञा नहीं है। यह दो कार्यों को परिभाषित करता है: readmsgऔर sendmsgक्रमशः कनेक्शन के लिए / से पढ़ना / लिखना। चर में फ़ाइल-डिस्क्रिप्टर 3 से पढ़ने के लिए readmsgउपयोग करता IFS= read -r -u 3 -t "$READ_TIMEOUT" lineहै line, और फ़ाइल डिस्क्रिप्टर 4 में लिखने के लिए sendmsgउपयोग करता echo "$(date +%s.%N) >>> $line" >&4है। वैसे भी, यह पूरी विधि को स्पष्ट करता है। " pipeकमांड" का उल्लेख अभी भी पाठकों के लिए एक रहस्य है।
अरीफ

जवाबों:


18

उस कमांड ने फ़ाइल डिस्क्रिप्टर 3 पर कनेक्शन को खोला। इसलिए कनेक्शन को बंद करने के लिए, आपको फ़ाइल डिस्क्रिप्टर को बंद करने की आवश्यकता है। 3. ऐसा करने के लिए:

exec 3<&-

1
क्या यह एक उचित shutdown(3)कॉल, या सिर्फ close(2)फ़ाइल डिस्क्रिप्टर करेगा?
केविन

करता है close, लेकिन shutdownकरीब से अधिक उचित नहीं है। shutdownकेवल वास्तविक उपयोग तब होता है जब आप केवल एक डुप्लेक्स सॉकेट को बंद करना चाहते हैं।
पैट्रिक

4
A shutdownफ़ाइनल भेजता है, जबकि closeRST भेजता है। ये भौतिक रूप से अलग-अलग चीजें हैं।
केविन

2
@ केविन RST सॉकेट को बंद करने के कारण होता है जो पहले इसके सभी डेटा को पढ़े बिना होता है। यदि आप डेटा के अंत में पढ़ते हैं और फिर एक करीबी करते हैं, तो एक फिन भेज देगा।
कैस्परल्ड

@kasperd: UNIX सॉकेट एपीआई में, यह जानने का एकमात्र तरीका है कि क्या कोई डेटा लंबित है, या तो नॉनब्लॉकिंग सॉकेट से पढ़ने का प्रयास करें, या कुछ ऐसा कॉल करें select(), और मुझे विश्वास नहीं है कि बैश या तो विकल्प प्रदान करता है।
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.