จะรับไฟล์ไปยังโฮสต์ได้อย่างไรเมื่อคุณมีคอนโซลซีเรียล?


20

เมื่อทั้งหมดที่คุณมีคือซีเรียลคอนโซล (พูดผ่าน telnet ผ่านเทอร์มินัลเซิร์ฟเวอร์) วิธีใดบ้างที่สามารถใช้ในการถ่ายโอนไฟล์เข้า / ออกจากโฮสต์

การตัด / วางเหมาะสำหรับสิ่งเล็ก ๆ / พิมพ์ได้และฉันได้เล่นด้วยการรวมกันของ uuencode / uudecode (พร้อม gzip) จัดการกับ unprintable แต่มันมีข้อ จำกัด มาก


จากความคิดเห็นบางส่วนที่คุณทิ้งไว้เกี่ยวกับความพร้อมใช้งานของสาธารณูปโภคมันจะช่วยได้ถ้าคุณสามารถตั้งชื่อแพลตฟอร์มและ / หรือร่างสภาพแวดล้อมที่คุณกำลังเข้าร่วมไม่เช่นนั้นคุณจะได้รับหุ้น Kermit / XMODEM / YMODEM / ZMODEMk ผ่านทางคำตอบของสถานี ...
เอเวอรี่เพน

ฉันใช้เวลาเกือบทั้งวันกับกล่อง Solaris ดังนั้นในแง่เหล่านั้นถ้าสิ่งที่คุณมีคือ SUNCreq (หรือบางทีอาจเป็น SUNWCuser) คุณจะได้คำตอบอะไร
Stephen Paul Lesniewski

เพียง 5 ปีที่ผ่านมา: P ตอนนี้คุณสามารถยอมรับคำตอบของฉันเพราะมันเป็นสิ่งที่คุณต้องการ .... แต่น่าจะไม่ต้องการในวันนี้
JM Becker

คำตอบ:


12

โปรแกรมคอนโซลแบบอนุกรม¹คุณจะใช้ที่ปลายอีกด้านหนึ่งของการเชื่อมต่อจะมีวิธีการส่งไฟล์ไปยังด้านระยะไกล วิธีการที่คุณไปเกี่ยวกับมันขึ้นอยู่กับทรัพยากรที่คุณมีอยู่ในระบบระยะไกล

ฉันมีlrzszหรือkermitด้านไกล

กรณีที่ง่ายที่สุดคือถ้าคุณมีโปรแกรมถ่ายโอนไฟล์ไบนารีที่เป็นของแข็งติดตั้งอยู่บนด้านระยะไกลเช่นหรือlrzsz kermitนี่เป็นเรื่องธรรมดามากกว่าวันนี้อีกครั้ง แต่ระบบเฉพาะของคุณอาจยังคงมีหนึ่งในนี้

โปรแกรมคอนโซลแบบอนุกรมที่คุณใช้อยู่ในพื้นที่ส่วนใหญ่จะมีวิธีในการอัปโหลด Zmodem หรือ Kermit ซึ่งช่วยให้คุณสามารถส่งสิ่งที่คุณต้องการได้โดยตรง

ในกรณีของ Zmodem เพียงพิมพ์rzบนระบบรีโมตซึ่งส่งสตริงพิเศษที่เทอร์มินัลอนุกรมท้องถิ่นควรเข้าใจทำให้มันปรากฏขึ้นในกล่องโต้ตอบตัวเลือกไฟล์

มิตเป็นโปรโตคอลที่ง่ายกว่าดังนั้นคุณต้องเริ่มการถ่ายโอนด้วยตนเองในกรณีนั้น

ฉันไม่มีโปรแกรมถ่ายโอนไฟล์ไบนารี แต่ฉันมีuuencode/base64

มีข้อดีหลายประการในการใช้โปรแกรมการถ่ายโอนไฟล์ไบนารีที่เหมาะสมเหมือนlrzszหรือkermit: ประสิทธิภาพ Checksumming, ลองอัตโนมัติเริ่มต้นใหม่การถ่ายโอนยกเลิกการถ่ายโอนไฟล์หลาย ฯลฯ แต่เหล่านี้เป็นสินค้าฟุ่มเฟือย หากคุณต้องการส่งไฟล์เพียงไฟล์เดียวหรือคุณส่งไฟล์ได้น้อยมากคุณสามารถลบไฟล์ ASCII ได้

เนื่องจากเทอร์มินัลโปรโตคอลแปลค่าไบต์จำนวนมากที่เกิดขึ้นในไฟล์ข้อมูลไบนารีคุณไม่สามารถส่งไฟล์โดยตรงผ่านการเชื่อมต่อเดียวกัน หากคุณทำเช่นนั้นรหัสการจำลองเทอร์มินัลที่ปลายทั้งสองจะพยายามตีความข้อมูลบางส่วนทำให้ข้อมูลเสียหายและมีแนวโน้มที่จะเกิดความสับสนกับรหัสการจัดการเครื่อง

คุณได้รับสิ่งนี้โดยการเข้ารหัสข้อมูลไบนารีลงในเซตย่อยที่ปลอดภัยของ ASCII ที่ด้านโลคัลจากนั้นเปลี่ยนกลับเป็นข้อมูลไบนารีดิบที่ด้านระยะไกล นี่คือสิ่งที่uuencodeและbase64โปรแกรมทำแตกต่างกันในตัวเลือกอัลกอริทึมเล็กน้อยเท่านั้น

บนระบบโลคัลคุณเข้ารหัสไฟล์: ²

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

จากนั้นคุณพิมพ์คำสั่งนี้บนระบบรีโมตและส่งไฟล์โดยใช้คุณสมบัติ "ASCII upload" ของคอนโซลอนุกรมในเครื่อง:

$ 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

หลังจากคุณเริ่มคำสั่งแรกแล้วให้ทำการ "ASCII upload" ของlrzsz.tgz.uueไฟล์ไปยังระบบรีโมต ไปป์ไลน์ยอมรับข้อมูล uuencoded และถอดรหัสเป็นไบนารี tarball สำหรับคุณซึ่งคุณสามารถแยกและสร้างได้

แต่ฉันไม่มีคอมไพเลอร์ C ในระบบระยะไกล

หากคุณไม่มีคอมไพเลอร์ในระบบรีโมตคุณสามารถคอมไพล์โปรแกรมrz(หรืออะไรก็ได้) บนระบบโลคัลและส่งไปยังระบบรีโมตโดยใช้เทคนิคด้านบน


เชิงอรรถ:

  1. minicom , picocom , PuTTY , VanDyke CRT ...

  2. คุณต้องตั้งชื่อไฟล์อินพุตให้เป็นuuencodeสองเท่าของรุ่นนี้หนึ่งครั้งเพื่อตั้งชื่อแหล่งที่มาของข้อมูลอินพุตและอีกครั้งเพื่อประกาศสิ่งที่ระบบรีโมตควรเรียกใช้ไฟล์เมื่อมันถอดรหัสข้อมูลไปยังไฟล์เอาต์พุต คุณอาจต้องการให้ระบบรีโมตมีชื่ออื่นสำหรับไฟล์เอาต์พุต

    เวอร์ชันในท้องถิ่นของคุณuuencodeอาจทำงานแตกต่างกัน


เยี่ยมมากฉันหวังว่าคำถามนี้จะมีคำตอบที่กล่าวถึงมิต! +1;)
Tim

นี่เป็นคำตอบที่ดีฉันชอบส่วน "แต่ฉันไม่มี" น่าเสียดายที่มันหยุดที่สิ่งที่ค่อนข้างป๊อปและไม่ไปลึกจริงๆ การสร้างไฟล์เรียกทำงานไบนารีสำหรับสถาปัตยกรรมที่แตกต่างจากรหัส ASCII เพียงอย่างเดียวหรือไม่ นี่คือ bootstrap: retrocomputing.stackexchange.com/questions/4672/…
pfalcon

5

โดยทั่วไปคุณต้องใช้วิธีก่อนอินเทอร์เน็ตเพื่อถ่ายโอนผ่านอนุกรม tty และคุณต้องมีวิธีรับการถ่ายโอนในอีกด้านหนึ่ง เห็นได้ชัดว่าวิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้ ZMODEM ซึ่งหมายความว่าคุณจำเป็นต้องมีเครื่องมือที่szมีอยู่แล้วในตอนท้ายของการรับ อย่างไรก็ตามไม่สามารถทำได้เช่นเมื่อเป้าหมายการรับเป็นเราเตอร์ที่ไม่มีเครือข่าย

วิธีเดียวที่เป็นไปได้ในการถ่ายโอนนี้คือโดยตรงผ่านช่องทางโดยใช้เทอร์มินัลที่ปลอดภัย ASCII ในรูปแบบที่สะอาดก่อน 8 บิต ฉันจะใช้เครื่องมือที่ทันสมัยกว่านี้ซึ่งฉันหวังว่าจะได้รับการติดตั้งในระบบส่วนใหญ่

ผู้ส่ง:

ก่อนอื่นเราเข้ารหัสไฟล์ของเรา

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 + Ccatเพื่อทำลายที่

ตอนนี้เราถอดรหัสไฟล์

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

ทำทุกสิ่งที่คุณทำได้เพื่อตรวจสอบว่าไฟล์นั้นเป็นข้อมูลสำคัญกับไฟล์ที่คุณส่งเนื่องจากการถ่ายโอน ASCII ไม่มีการป้องกันการตรวจสอบ กล่องรับของฉันมีsha512sumแต่คำสั่ง checksum ใด ๆ ก็เพียงพอแล้ว เมื่อคุณยืนยันผลรวมการจับคู่ด้วยตนเองคุณสามารถถือว่าการถ่ายโอนสำเร็จแล้ว!


(และอีกสองปีต่อมา ... ) จากประสบการณ์ของฉันในการถ่ายโอนไฟล์ข้ามระบบที่มีจุดสิ้นสุดของบรรทัด (ขอบคุณ Microsoft!) การเข้ารหัส / ถอดรหัส base64 ไม่สนใจรูปแบบการสิ้นสุดบรรทัด \r\nหรือ\nทำงานทั้งคู่แม้ว่าพวกเขาจะ "คงที่" ไปพร้อมกัน ฉันจำไม่ได้ทันทีว่าอยู่ในมาตรฐาน base64 หรือแค่เครื่องมือที่ใช้ แต่ฉันคิดว่ามันเป็นพฤติกรรมมาตรฐาน
Andrew Henle

5

บางทีคุณอาจจะให้minicomลอง


สิ่งนี้ไม่ต้องการบางสิ่งเช่น 'sx' หรือ 'sz' บนโฮสต์ต้นทางหรือไม่
Stephen Paul Lesniewski

4
ไม่ minicom จัดการ xfers ไฟล์ของตัวเอง sx, sy, sz และ rx, ry, rz เป็นโปรแกรมที่แยกกันซึ่งมักจะพบในแพ็คเกจชื่อ lszrz หรือบางสิ่งบางอย่าง แม้ว่าฉันจะแนะนำให้ใช้ sz และ rz เล็กเรียบง่ายและทำในสิ่งที่มันทำ Minicom เป็นโปรแกรมจำลองทั้งเทอร์มินัล
reiche

4
คำตอบนี้ไม่ถูกต้อง Minicom วางไข่ lrzsz สำหรับการถ่ายโอนไฟล์ Minicom ไม่สามารถและไม่จัดการกับการถ่ายโอนไฟล์ของตัวเอง
Jonathan Cline IEEE

5

ไม่ทราบว่าจะใช้งานได้หรือไม่หากคุณมีคอนโซลซีเรียล แต่ถ้าคุณมีการเข้าถึงเครือข่ายเลยคุณสามารถใช้nc(1)เพื่อคัดลอกไฟล์โดยใช้ TCP / IP

# 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 สำหรับหมายเลขพอร์ต TCP โดยพลการ คุณสามารถใช้พอร์ตใดก็ได้ที่คุณสามารถเข้าถึงได้ และไม่จำเป็นต้องเป็นอุปกรณ์ มันสามารถเป็นไฟล์ใด ๆ

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

ฉันจะใช้มิตมิต , ปู่ย่าตายายของโปรแกรมถ่ายโอนไฟล์ เราใช้มันมานานแล้วก่อนที่จะมีลินุกซ์


อ่าใช่ .. ฉันจำได้ว่าทำเช่นนั้น แต่ในกรณีนี้มิตไม่ได้ติดตั้งบนโฮสต์ต้นทาง
Stephen Paul Lesniewski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.