जब आपके पास एक सीरियल कंसोल है, तो होस्ट को फ़ाइल कैसे प्राप्त करें?


21

जब आपके पास एक सीरियल कंसोल होता है (टेलनेट के माध्यम से टर्मिनल सर्वर के माध्यम से), एक होस्ट के अंदर / बाहर फ़ाइलों को स्थानांतरित करने के लिए किन तरीकों का उपयोग किया जा सकता है?

कट / पेस्ट छोटे / प्रिंट करने योग्य सामान के लिए काम करता है और मैंने uuencode / uudecode (gzip के साथ) के संयोजन के साथ खेला है जो कि अप्रत्याशित को संभालता है लेकिन यह बहुत सीमित है।


उपयोगिताओं की उपलब्धता के बारे में आपके द्वारा छोड़ी गई कुछ टिप्पणियों को देखते हुए, यह मदद करेगा कि क्या आप उस प्लेटफ़ॉर्म का नाम दे सकते हैं और / या उस वातावरण को रेखांकित कर सकते हैं जो आप कर रहे हैं। अन्यथा, आप स्टॉक Kermit / XMODEM / YMODEM / प्राप्त करने जा रहे हैं। ZMODEMk टर्मिनल उत्तरों के माध्यम से ...
Avery Payne

मैं अपना अधिकांश दिन सोलारिस बॉक्स के पीछे बिताता हूं। तो उन शब्दों में, अगर आप सब सिन्क्रैक (या शायद सनव्यूसर) थे तो आप क्या जवाब देंगे?
स्टीफन पॉल लेस्निव्स्की

एक मात्र 5 साल की देरी: पी अब आप मेरे जवाब को स्वीकार कर सकते हैं, क्योंकि यह वही था जो आप चाहते थे .... लेकिन आज की आवश्यकता नहीं है।
जेएम बेकर

जवाबों:


13

कनेक्शन के दूसरे छोर पर आपके द्वारा उपयोग किए जाने वाले सीरियल कंसोल प्रोग्रामों में रिमोट साइड में फ़ाइल भेजने का कोई तरीका होगा। आप इसके बारे में बिल्कुल कैसे जाते हैं यह इस बात पर निर्भर करता है कि आपके पास रिमोट सिस्टम पर कौन से संसाधन उपलब्ध हैं।

आई हैव lrzszया kermitरिमोट साइड पर

सबसे आसान मामला यह है कि यदि आपके पास रिमोट बाइनरी फाइल ट्रांसफर प्रोग्राम है जो रिमोट साइड पर lrzszया जैसे इंस्टॉल किया गया है kermit। यह एक बार आज की तुलना में अधिक सामान्य था, लेकिन आपके विशेष सिस्टम में अभी भी इनमें से एक हो सकता है।

सीरियल कंसोल प्रोग्राम जिसका उपयोग आप स्थानीय स्तर पर कर रहे हैं, लगभग निश्चित रूप से एक ज़मोडेम या केर्मिट अपलोड करने का एक तरीका है, जो आपको सीधे आपको जो कुछ भी ज़रूरत है उसे भेजने की अनुमति देता है।

ज़मोडेम के मामले में, बस rzरिमोट सिस्टम पर टाइप करें, जो एक विशेष स्ट्रिंग भेजता है जिसे स्थानीय सीरियल टर्मिनल को समझना चाहिए, जिससे यह एक फाइल पिकर डायलॉग पॉप अप हो सकता है।

Kermit एक सरल प्रोटोकॉल है, इसलिए आपको उस मामले में मैन्युअल रूप से स्थानांतरण शुरू करना होगा।

मेरे पास बाइनरी फाइल ट्रांसफर प्रोग्राम नहीं है, लेकिन मेरे पास है uuencode/base64

एक उचित बाइनरी फ़ाइल ट्रांसफर प्रोग्राम जैसे lrzszया kermit: दक्षता, चेकसमिंग, स्वचालित रिट्रीज़, गर्भपात स्थानांतरण पुनरारंभ, कई फ़ाइल स्थानांतरण आदि का उपयोग करने के कई फायदे हैं , लेकिन ये विलासिता हैं । यदि आपको केवल एक फ़ाइल भेजने की आवश्यकता है, या आप शायद ही कभी फ़ाइलें भेज रहे हैं, तो आप ASCII अपलोड के साथ दूर हो सकते हैं।

क्योंकि टर्मिनल प्रोटोकॉल कई बाइट मानों की व्याख्या करते हैं जो एक बाइनरी डेटा फ़ाइल में होते हैं, आप फ़ाइल को सीधे उसी कनेक्शन के माध्यम से नहीं भेज सकते हैं; यदि आप करते हैं, तो दोनों ओर टर्मिनल इम्यूलेशन कोड कुछ डेटा की व्याख्या करने की कोशिश करेंगे, डेटा को दूषित करेंगे और टर्मिनल हैंडलिंग कोड को भी भ्रमित करेंगे।

आप बाइनरी डेटा को स्थानीय पक्ष पर ASCII के एक सुरक्षित सबसेट में एन्कोडिंग करके इसके चारों ओर प्राप्त करते हैं, फिर इसे दूरस्थ तरफ कच्चे बाइनरी डेटा में बदल देते हैं। यह uuencodeऔर base64कार्यक्रम केवल मामूली एल्गोरिथ्म विकल्पों में भिन्न होते हैं।

स्थानीय सिस्टम पर, आप फ़ाइल को एनकोड करते हैं: you

$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz

फिर आप इस कमांड को रिमोट सिस्टम पर टाइप करते हैं, और स्थानीय सीरियल कंसोल के "ASCII अपलोड" फीचर का उपयोग करके फाइल भेजते हैं:

$ cat | uudecode

जब फ़ाइल अपलोड खत्म हो जाती है, तो Ctrl-Cबाहर निकलने के लिए हिट करें cat। अब आपके पास रिमोट सिस्टम पर आपकी डिकोड की गई फ़ाइल है, जैसा आप चाहते थे।

लेकिन मेरे पास भेजने के लिए कई फाइलें हैं, और प्रिंट करने योग्य ASCII ट्रांसकोडिंग एक दर्द है!

उच्च स्तर की तकनीक तक अपने आप को बूटस्ट्रैप करना कठिन नहीं है। यदि रिमोट सिस्टम में C कंपाइलर है, तो आप रिमोट सिस्टम को lrzszसोर्स कोड की कॉपी भेजने के लिए पूर्व तकनीक का उपयोग कर सकते हैं । स्थानीय पक्ष में:

$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz

फिर रिमोट सिस्टम पर, इसे सीरियल कंसोल प्रोग्राम के माध्यम से टाइप करें:

$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally

पहली कमांड शुरू करने के बाद, lrzsz.tgz.uueरिमोट सिस्टम पर फ़ाइल का "एएससीआईआई अपलोड" करें । पाइपलाइन uuencoded डेटा को स्वीकार करता है और इसे आपके लिए एक बाइनरी टारबॉल में डिकोड करता है, जिसे आप अनपैक और निर्माण कर सकते हैं।

लेकिन मुझे रिमोट सिस्टम पर सी कंपाइलर नहीं है

आप भी दूरस्थ सिस्टम पर एक संकलक की जरूरत नहीं है, तो आप कर सकते हैं पार संकलनrz स्थानीय सिस्टम पर (या जो भी) कार्यक्रम और इसके बाद के संस्करण तकनीक का उपयोग कर दूरस्थ प्रणाली को भेजें।


फुटनोट:

  1. minicom , picocom , पुट्टी , वेंडाइक सीआरटी ...

  2. आपको uuencodeइनपुट डेटा के स्रोत को नाम देने के लिए, इनपुट फ़ाइल का नाम दो बार देना होगा, और फिर से यह घोषित करना होगा कि रिमोट सिस्टम को फाइल को कॉल करना चाहिए जब वह डेटा को आउटपुट फाइल में डिकोड करता है। आप चाहते हैं कि रिमोट सिस्टम अपनी आउटपुट फ़ाइल के लिए एक अलग नाम रख सके।

    आपका स्थानीय संस्करण uuencodeभिन्न व्यवहार कर सकता है।


शानदार, मैं उम्मीद कर रहा था कि इस सवाल का उत्तर देने का उल्लेख किया गया था! +1;)
टिम

यह अच्छा जवाब है, मुझे यह पसंद है लेकिन "बट आई डोंट हैव" सेक्शन। दुर्भाग्य से, यह काफी पॉप स्टॉप पर रुकता है और वास्तव में गहरा नहीं जाता है। केवल ASCII कोड से विभिन्न आर्किटेक्चर के लिए द्विआधारी निष्पादन योग्य फाइलें बनाना किसी को भी कोड करता है? यहाँ बूटस्ट्रैप के लिए है: retrocomputing.stackexchange.com/questions/4672/…
pfalcon

5

मूल रूप से आपको एक सीरियल ट्टी पर ट्रांसफर करने के लिए प्री-इंटरनेट विधियों का उपयोग करना होगा, और आपके पास दूसरी तरफ ट्रांसफर प्राप्त करने का एक तरीका होना चाहिए। स्पष्ट रूप से ऐसा करने का सबसे अच्छा तरीका ZMODEM का उपयोग करना है, जिसका अर्थ है कि आपको szप्राप्त अंत पर पहले से ही एक उपकरण की आवश्यकता है । हालांकि, यह हमेशा संभव नहीं होता है, उदाहरण के लिए, जब प्राप्त लक्ष्य नेटवर्क के बिना एक राउटर है।

इस हस्तांतरण को करने का एकमात्र संभव तरीका चैनल पर सीधे है, पूर्व-8-बिट स्वच्छ शैली में टर्मिनल सुरक्षित ASCII का उपयोग करके। मैं और अधिक आधुनिक उपकरणों का उपयोग करने जा रहा हूं, कि मुझे आशा है कि अधिकांश प्रणालियों पर स्थापित होंगे।

प्रेषक:

सबसे पहले हम अपनी फाइल को एनकोड करते हैं

base64 file.tar.gz > file.tar.gz.b64

अब सुनिश्चित करें कि आपका com send-file कमांड है ascii-xfr, यह मेरा कनेक्शन कमांड लाइन था

picocom -f n -p n -d 8 -b 115200  --send-cmd "ascii-xfr -snv" /dev/ttyS0

आम तौर पर हम ascii-xfrप्राप्त करने के पक्ष में चाहते हैं , लेकिन चूंकि हमारे पास यह नहीं है, इसलिए यह -nसही लाइन एंडिंग बनाए रखकर इसके आसपास काम करता है।

रिसीवर:

अब जब हम कनेक्ट हो गए हैं, तो उस निर्देशिका पर जाएं जहां आप प्राप्त फ़ाइल चाहते हैं।

cd /tmp/
cat > file.tar.gz.b64

Picocom पर, मैं अभी CTRL + a + s , और जो फ़ाइल भेज रहा हूँ, उसका पूरा पथ दर्ज करता हूँ। एक बार स्थानांतरण पूरा हो जाने के बाद, आपको उसे तोड़ने के लिए CTRL + c की आवश्यकता होगी cat

अब हम फाइल को डिकोड करते हैं,

base64 -d file.tar.gz.b64 > file.tar.gz

उस फ़ाइल को सत्यापित करने के लिए जो कुछ भी आप कर सकते हैं उसे करें, जो आपके द्वारा भेजा गया है, वह IDENTICAL है, क्योंकि ASCII स्थानांतरण के पास कोई चेकसम सुरक्षा नहीं है। मेरे प्राप्त बॉक्स में था sha512sum, लेकिन कोई भी चेकसम कमांड पर्याप्त होगा। एक बार जब आप मैन्युअल रूप से रकम मैच की पुष्टि करते हैं, तो आप मान सकते हैं कि स्थानांतरण सफल रहा था!


(और दो साल बाद ...) मेरे अनुभव में उन प्रणालियों को फाइल ट्रांसफर करना है जो लाइन एंडिंग का धन्यवाद करती हैं (धन्यवाद माइक्रोसॉफ्ट!), बेस 64 एन्कोडिंग / डिकोडिंग लाइन एंडिंग स्टाइल की परवाह नहीं करता है। \r\nया बस \nदोनों काम करते हैं भले ही वे रास्ते में "तय" हो जाएं। मुझे यह याद नहीं है कि अगर यह base64 मानक या मेरे द्वारा उपयोग किए जाने वाले औजारों में है, लेकिन मुझे संदेह है कि यह वास्तव में मानक व्यवहार है।
एंड्रयू हेनले

5

हो सकता है कि आपको मिनिकॉम एक कोशिश देनी चाहिए ।


क्या इसके लिए स्रोत होस्ट पर 'sx' या 'sz' जैसी किसी चीज़ की आवश्यकता नहीं है?
स्टीफन पॉल लेस्निव्स्की

4
नहीं, मिनिकॉम अपनी खुद की फ़ाइल को स्थानांतरित करता है। sx, sy, sz और rx, ry, rz अलग-अलग प्रोग्राम हैं, जो आमतौर पर azly lszrz या कुछ और नाम के पैकेज में मिलते हैं। हालाँकि मैं सुझाव दूंगा sz और rz का उपयोग करके। छोटा, सरल और यह वही करता है जो यह करता है। मिनिकॉम एक संपूर्ण टर्मिनल एमुलेटर है।
Reiche

4
यह उत्तर सही नहीं है। Minicom फ़ाइल स्थानांतरण के लिए lrzsz spawns। Minicom नहीं कर सकते हैं और इसे संभाल नहीं है यह खुद फ़ाइल स्थानांतरण है।
जोनाथन क्लाइन IEEE

5

पता नहीं कि यह काम करेगा यदि आप सभी एक सीरियल कंसोल थे, लेकिन यदि आपके पास नेटवर्क एक्सेस है, तो आप nc(1)टीसीपी / आईपी का उपयोग करके फ़ाइलों को कॉपी कर सकते हैं ।

# WARNING: Depending on your setup, this could make your system unbootable
root@destination-box.local # nc -l 8675 | dd of=/dev/sdXXX
root@source-box.local # dd if=/dev/sdYYY | nc destination-box.local 8675

उपरोक्त उदाहरण में, मैंने sdbYYYएक स्रोत बॉक्स से sdaXXXगंतव्य बॉक्स पर क्लोन किया । टीसीपी पोर्ट नंबर के लिए 8675 की मेरी पसंद मनमानी थी; आप किसी भी बंदरगाह का उपयोग कर सकते हैं जिसकी आपके पास पहुंच है। और इसके लिए एक उपकरण होना आवश्यक नहीं है; यह कोई भी फाइल हो सकती है।

kevin@destination-box.local $ nc -l 12345 >> ~/.ssh/authorized_keys
kevin@source-box.local $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345

दूसरे उदाहरण में, मैंने अपनी rsa सार्वजनिक कुंजी ( ~/.ssh/id_rsa.pub) की प्रतिलिपि बनाई और इसे लक्ष्य होस्ट के लिए अधिकृत कुंजी फ़ाइल में जोड़ा।


5
क्या मैं आपके पहले विचार के ऊपर एक बड़ा लाल चेतावनी संकेत दे सकता हूँ? सीखने के लिए दिल के साथ कुछ अकेली आत्मा कुछ ऐसा निष्पादित कर सकती है, जो केवल फाइलों को कॉपी करने की उम्मीद में है, निम्नलिखित पैराग्राफ को पहले पढ़े बिना :)
reiche

2

मैं का प्रयोग करेंगे कर्मिट , filetransfer कार्यक्रमों के दादा-दादी। हमने पहले ही लिनक्स का उपयोग किया था।


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