ดาวน์โหลดไฟล์ผ่านเซสชัน SSH ที่ใช้งานอยู่


86

ฉันต้องการดาวน์โหลดไฟล์จากเซสชัน SSH ที่ใช้งานอยู่ ในหลายกรณีผมอาจจะเพียงแค่ใช้ SFTP, scp, rsyncet al, แต่มีบางครั้งที่ผมได้ยกระดับสิทธิ์บนเซิร์ฟเวอร์ระยะไกลในทางที่ฉันไม่สามารถใช้วิธีการเหล่านี้

หากคุณกำลังดิ้นรนที่จะเข้าใจในสิ่งที่ผมหมายถึงคิดว่าคุณต้องการที่จะดาวน์โหลดอะไรบางอย่างจากหรือ/root/ /var/log/auth.logการเข้าสู่ระบบถูกปิดการใช้งาน (เพราะเราไม่ใช่คนโง่) คุณจะรับไฟล์นั้นได้อย่างไร? คัดลอกบางส่วนที่ป้องกันน้อยกว่าแล้วย้ายหรือไม่ นี่คือ clunky นอกจากนี้ยังมีสถานการณ์จำลองที่เส้นทางระยะไกลมีความซับซ้อนหรือชั่วคราวหรือไม่แม้แต่เส้นทางเพราะฉันต้องการผลลัพธ์ของคำสั่งระยะไกลที่เก็บไว้ในเครื่อง จัดเก็บจากระยะไกลแล้วคัดลอก clunk!

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

$oli@remote: cp /root/cheesecake /local/

cwdและมันก็จะปรากฏในท้องถิ่นของฉัน และการเข้าถึงแบบสองทิศทางจะไม่เป็นเรื่องเลวร้าย


แปดปีที่ผ่านมานับตั้งแต่ฉันถามคำถามนี้และเราได้พบกับกลุ่มของจริง แต่มันก็ยังคงเป็นปัญหาที่ฉันยังต้องดิ้นรนเป็นครั้งคราว

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


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

1
ฉันประหลาดใจจริง ๆ ที่แม้หลังจาก 8 คำตอบไม่มีวิธีการทำเช่นนี้จริงๆ
endolith

คำตอบ:


34

คุณอาจต้องการตรวจสอบzsshซึ่งมีอยู่ในจักรวาลและพร้อมใช้งานด้วย

sudo apt-get install zssh

คุณต้องการมันบนเซิร์ฟเวอร์อูบุนตูและไคลเอนต์ของคุณ แต่โดยทั่วไปเมื่อล็อกอินด้วย zssh คุณแค่กด 'ctrl- @' และมันจะแสดง "โหมดการถ่ายโอนไฟล์" ซึ่งจะช่วยให้คุณส่งไฟล์กลับไปที่ท่อของคุณ เครื่องไคลเอนต์หรืออัปโหลดจากไคลเอนต์ไปยังเซิร์ฟเวอร์

อย่างไรก็ตามคุณไม่จำเป็นต้องเปิดใช้ซ้ำหรือเปิดหน้าต่างใหม่เพื่อสแกน

หากคุณใช้คีย์ ssh และตัวแทน ssh คุณสามารถทำได้ง่ายๆ:

[enter]~[ctrl]-Z

ซึ่งจะแบ็กกราวน์เอสเอสแล้วเพียง scp $!:/whatever/whatever .'

เมื่อไฟล์ถูกโอนfgเพื่อรับ ssh กลับ

หากคุณไม่ได้ใช้คีย์ ssh คุณยังคงสามารถใช้ตัวเลือก "ControlMaster" และ "ControlPath" ที่เพิ่มเข้าไปในเวอร์ชัน OpenSSh ล่าสุดได้ แต่สิ่งที่ยุ่งยากก็คือตรวจสอบ man ssh_config


24

สมมติว่าคุณกำลังใช้เซิร์ฟเวอร์ ssh บนเดสก์ท็อปของคุณ (มีวิธีแก้ไขปัญหานี้ แต่ฉันคิดว่าพวกเขาทั้งหมดเพิ่มความซับซ้อนและอาจมีปัญหาด้านความปลอดภัย) คุณสามารถตั้งค่าอุโมงค์ ssh แบบย้อนกลับได้ ดูSSH คัดลอกไฟล์ไปยังระบบโลคัลได้อย่างง่ายดาย มากกว่าที่unix.SE

  • พิมพ์Enter ~C Enter -R 22042:localhost:22 Enterเพื่อสร้างการส่งต่อพอร์ตย้อนกลับจากเซิร์ฟเวอร์ของคุณไปยังเดสก์ท็อปของคุณ (22042 สามารถเป็นหมายเลขพอร์ตใดก็ได้ระหว่าง 1024 ถึง 65534 ที่ไม่ได้ใช้งาน)
  • จากนั้นscp -P 22042 foo localhost:จะคัดลอกไฟล์fooในไดเรกทอรีปัจจุบันของคุณบนเซิร์ฟเวอร์ไปยังบ้านของคุณบนเดสก์ท็อป
  • ตอนนี้ย้ายไฟล์ลงในไดเรกทอรีปัจจุบันของคุณบนเดสก์ทอปโดยการพิมพ์+Enter ~ CtrlZ mv ~/foo . Enter fg Enter

Ssh escape sequencesเริ่มต้นด้วย~; ตัวหนอนจะได้รับการยอมรับหลังจากขึ้นบรรทัดใหม่เท่านั้น ~ Ctrl+Zวาง ssh ไว้ในพื้นหลัง ~Cป้อนบรรทัดคำสั่งที่คุณสามารถสร้างหรือลบการส่งต่อ


1
การใช้การเข้ารหัสและการบีบอัด 2 ชั้นนั้นเกินความจริงเล็กน้อยนั่นคือสาเหตุที่ฉันแนะนำให้ใช้ rsh หรือ ftp สำหรับ "ลิงก์ย้อนกลับ"
JanC

2
@JanC: ต้องมีการตั้งค่าเพิ่มเติม: คุณต้องติดตั้งเซิร์ฟเวอร์ rsh หรือ ftp และตรวจสอบให้แน่ใจว่าการกำหนดค่านั้นปลอดภัย ค่าใช้จ่ายในการเข้ารหัสนั้นน้อยมากแม้แต่ในเน็ตบุ๊ก
Gilles

โดยค่าเริ่มต้น ssh-server จะไม่ได้รับการติดตั้ง ;)
JanC

@JanC: ข้อดีอีกอย่างของ ssh คือถ้าคุณเปิดใช้งานการส่งต่อเอเจนต์คุณจะไม่ต้องพิมพ์รหัสผ่านเพื่อทำสำเนา ประสิทธิภาพของเวิร์กโฟลว์มากกว่าการคำนวณไมโครคอมพิวเตอร์
Gilles

คุณสามารถทำสิ่งนั้นกับบริการอื่น ๆ (บางอย่าง) ได้เช่นกัน ไม่ว่าในกรณีใดก็ตามมีวิธีแก้ปัญหาที่คล้ายกันหลายอย่างซึ่งทั้งหมดเกี่ยวข้องกับการตั้งค่าการเชื่อมต่อที่ใช้ช่องสัญญาณด้านหลังและดีมอนพิเศษ ... ;)
JanC

10

ฉันมากับวิธีการทำเช่นนี้กับ ssh มาตรฐาน มันเป็นสคริปต์ที่ทำซ้ำการเชื่อมต่อ ssh ปัจจุบันค้นหาไดเรกทอรีการทำงานของคุณบนเครื่องระยะไกลและคัดลอกไฟล์ที่คุณระบุกลับไปที่เครื่องท้องถิ่น ต้องการสคริปต์ 2 ตัวที่เล็กมาก (1 รีโมต 1 โลคัล) และ 2 บรรทัดในการกำหนดค่า ssh ของคุณ ขั้นตอนดังต่อไปนี้:

  1. เพิ่ม 2 บรรทัดเหล่านี้ใน~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    ตอนนี้ถ้าคุณมีการเชื่อมต่อ ssh กับ machineX open คุณไม่จำเป็นต้องใช้รหัสผ่านเพื่อเปิดอีกอัน

  2. สร้างสคริปต์ 1 บรรทัดบนเครื่องระยะไกลที่เรียกว่า ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. สร้างสคริปต์บนเครื่องโลคัลที่เรียกว่า ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. และสร้างนามแฝงสำหรับ grab.sh ใน ( ~/.bashrcหรือที่ใดก็ได้):

    alias grab=~/.grab.sh
    

แค่นี้แหละเสร็จแล้ว ตอนนี้ถ้าคุณเข้าสู่ระบบmachineX:/some/directoryเพียงแค่เปิด terminal ใหม่และพิมพ์

grab machineX filename

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

หมายเหตุ: เห็นได้ชัดว่าทั้งสคริปต์จะต้องเป็น "ปฏิบัติการ" chmod u+x filenameคือ


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

5

หากเครื่องไคลเอนต์ของคุณ (เครื่องที่คุณนั่งอยู่) เรียกว่า machineA และเครื่องที่คุณกำลัง SSH'ed เป็นเรียกว่า machine B. MachineA เครื่องในเครื่องของคุณต้องเปิดใช้งาน SSHD และเปิดพอร์ต 22 แล้ว:

scp myfile machineA:

คัดลอกmyfileบน MachineB ไปยังไดเรกทอรีบ้านของ MachineA บน machineA สิ่งนี้ถือว่า ID ผู้ใช้ / รหัสผ่านเหมือนกัน

scp myfile machineA:/newdir/newname

คัดลอกmyfileหนึ่ง MachineB ไปยัง/newdir/newnamemachineA สิ่งนี้ถือว่า ID ผู้ใช้ / รหัสผ่านเหมือนกัน

scp MachineA:/path/to/my/otherfile . 

รับสำเนาotherfileจากไดเร็กทอรี MachineA ของฉันบน MachineA และวางไว้ในไดเร็กทอรีการทำงานปัจจุบันของฉันบนเครื่อง MachineB (กำหนดในรูปแบบ UNIX มาตรฐานโดยใช้อักขระ "dot" (.)) สิ่งนี้ถือว่า ID ผู้ใช้ / รหัสผ่านเหมือนกัน

หากรหัสผู้ใช้ / รหัสผ่านไม่เหมือนกันให้ใช้:

scp myfile user@MachineA: เพื่อรับไฟล์

scp user@MachineA:/path/to/my/otherfile . เพื่อใส่ไฟล์

หมายเหตุเกี่ยวกับ SCP:

เช่นเดียวกับcpคำสั่งscpมีตัวเลือก -p เพื่อเผยแพร่การตั้งค่าการอนุญาตของไฟล์ต้นฉบับไปยังการคัดลอก (มิฉะนั้นการคัดลอกจะทำด้วยการตั้งค่าปกติสำหรับไฟล์ใหม่) และตัวเลือก -r เพื่อคัดลอกแผนผังไดเรกทอรีทั้งหมดด้วยหนึ่ง คำสั่ง

scpสร้างแชนเนลข้อมูลที่เข้ารหัสที่โปร่งใสอย่างสมบูรณ์ระหว่างเครื่องสองเครื่องดังนั้นข้อมูลไบนารี่ (เช่นรูปภาพหรือโปรแกรมที่ปฏิบัติการ) จะถูกรักษาไว้อย่างถูกต้อง นอกจากนี้ยังหมายความว่าscpไม่สามารถทำการแปลงการสิ้นสุดจุดสิ้นสุดของบรรทัดอัตโนมัติระหว่างระบบปฏิบัติการประเภทต่าง ๆ ได้เช่นเดียวกับ ftp ในโหมด "ascii" นั่นจะไม่เป็นปัญหาเมื่อคัดลอกระหว่างระบบ Unix ซึ่งทั้งหมดใช้ระเบียบแบบ end-of-line เดียวกัน


2

หากคุณเข้าถึงเซิร์ฟเวอร์ผ่าน ssh คุณจะสามารถเชื่อมต่อผ่าน sftp ได้เช่นกัน รักษา filezilla ไคลเอ็นต์ (GUI) ให้มีประโยชน์และวางเส้นทางที่คุณอยู่

ป้อนคำอธิบายรูปภาพที่นี่


2
สิ่งนี้จะได้รับประโยชน์จากรายละเอียดที่มากขึ้นรวมถึงวิธีการเชื่อมต่อกับเซิร์ฟเวอร์ SSH ด้วย FileZilla (ไม่ชัดเจน) ภาพหน้าจอนอกจากนี้ยังอาจช่วยนอกเหนือไปจากข้อความอธิบาย
Eliah Kagan

2

หากไฟล์ของคุณมีขนาดเล็กพอที่คุณสามารถเข้ารหัสด้วย base64 แล้วถอดรหัสภายใน:

remote.example.net $ base64 <myfile
 (คัดลอกผลลัพธ์)
local.example.net $ base64 -d> myfile
 (คัดลอกผลลัพธ์)
Ctrl +D

คำตอบเดิมที่ฉันได้รับ (และทดสอบ) จาก: https://unix.stackexchange.com/a/2869/194134


สิ่งนั้นเกี่ยวข้องกับอะไร? คุณไม่จำเป็นต้องเข้ารหัสไฟล์เพื่อ txfr พวกเขาด้วย SCP และอื่น ๆ
HörmannHH

1

มันไม่ได้ผ่านการเชื่อมต่อ SSH ที่ใช้งานอยู่ แต่scpคัดลอกไฟล์โดยใช้กลไกและสิทธิ์แบบเดียวกับที่ใช้ใน ssh


4
ฉันรู้จัก scp แต่เป็นเวิร์กโฟลว์ที่ไม่เชื่อมโยงกันมาก หากฉันกำลังทำงานในไดเรกทอรีระยะไกลที่กำหนดฉันต้องได้รับเส้นทางระยะไกลตัดการเชื่อมต่อ (หรือวางไข่เปลือกอื่น) ทำ scping เขียนเส้นทางและจากนั้นเชื่อมต่อใหม่ ฉันกำลังมองหาบางสิ่งที่คล้ายกับการเขียนget fileและมันกลับปรากฏขึ้นอย่างน่าอัศจรรย์บนเครื่องของฉัน ถ้าต้องทำเช่นนั้นผ่านทางบริการบางอย่างที่ติดอยู่เหนือ SSH ดังนั้นไม่ว่า .. แต่มันควรจะมีการเชื่อมต่อกับเซสชัน
Oli

รวมทั้งจะถูกแทนที่โดย SFTP (ดูคำตอบของฉัน)
โอลิเวีย Lalonde

@Oli - เนื่องจากปลายทั้งสองของทรานแซคชันเป็นกล่อง * nix ทั้งคู่มีแนวโน้มว่าจะsshdทำงานและดังนั้นคุณควรใช้scpบนบรรทัดคำสั่งของเซิร์ฟเวอร์เพื่อโยนไฟล์กลับไปยังไคลเอนต์ มีเวทย์มนตร์มากมายเหลือเกินที่จะเดินเล่น บางครั้งเรายังต้องกดปุ่ม โซลูชัน FileZilla นั้นมีประโยชน์เช่นกัน
zerobandwidth

1

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


หรือเพียงแค่
สแกน

1

konsole มีความสามารถดังกล่าวผ่านทางเมนู "แก้ไข -> อัปโหลด ZModem" ในขณะที่คุณอยู่ในเซสชันระยะไกล (หรือ Ctrl-Alt-U)

โปรดทราบ: แพคเกจlrzszจะต้องติดตั้งก่อน สำหรับฉันดูเหมือนว่าจะใช้งานได้เฉพาะสำหรับการอัปโหลดไฟล์ ASCII


0

เนื่องจากคุณกำลังเชื่อมต่อจากเดสก์ท็อปฉันเดาว่าคุณสามารถเปิดเทอร์มินัลที่สองได้

นี่คือวิธีที่ฉันมักจะทำ:

  • จากเทอร์มินัลเครื่องแรกที่ใช้งานเซสชัน ssh ฉันได้รับพา ธ แบบเต็มของไฟล์ที่ฉันต้องใช้โดยใช้อย่างใดอย่างหนึ่งrealpath myfileหรือreadlink -f myfile(Ubuntu รุ่นเก่าไม่ได้ติดตั้งไว้ล่วงหน้าrealpath) และคัดลอก
  • จากเทอร์มินัลที่สองที่ฉันใช้scpหรือsftpรับไฟล์วางเส้นทางแบบเต็มที่ฉันได้รับมาก่อน ตัวอย่างเช่น:scp user@host:/etc/some/file ./

มันค่อนข้างพื้นฐาน แต่ก็ยังจำได้ง่ายและไม่จำเป็นต้องใช้แพ็คเกจเพิ่มเติมในการทำงาน

รับเส้นทางแบบเต็มจากเทอร์มินัลแรกแล้ววางในเทอร์มินัลที่สอง


ไม่ช่วยปัญหา "พยายามรับไฟล์รูทและการล็อกอินโดยรูทไม่ได้รับอนุญาตโดยตรง" ถูกโพสต์ในคำถาม
Oli

0

น่าแปลกที่ฉันไม่เห็นการกล่าวถึงผู้บัญชาการเที่ยงคืนที่ดีคนใดที่ดีที่นี่ ในความคิดของฉันมันอาจเป็นตัวจัดการไฟล์ที่เป็นสากลและเป็นประโยชน์มากที่สุดสำหรับเชลล์ที่มีความสามารถด้านพลังงานซึ่งเป็นหนึ่งในเครื่องมือ "ต้องมี" สำหรับเคสซึ่งยังช่วยให้คุณเชื่อมต่อผ่าน SSH, FTP, SFTP ได้เช่นกัน พาเนลที่สองคุณสามารถเปิดระบบไฟล์อื่น ๆ (ในเครื่องของคุณ) และทำงานกับไฟล์ได้อย่างอิสระ

สิ่งที่คุณต้องมีคือ: apt-get install mc (from universe)

หลังจากนั้น, รัน mc, เปิดเมนูสำหรับแผงด้านซ้ายหรือขวา, เลือกการเชื่อมต่อเชลล์, ใส่ชื่อผู้ใช้ @ remote-ip, รหัสผ่าน - อันที่จริง, มัน .. คัดลอก (ที่นี่: ดาวน์โหลด) ไฟล์ / โฟลเดอร์จากเครื่องหนึ่งไปอีกเครื่องด้วย F5 ย้ายด้วย F6 และอื่น ๆ ตามปุ่มด้านล่าง สำหรับผู้ใช้ MS เก่า: เหมือนใน NC สำหรับ DOS


-2

WAY คิดมากเรื่องนี้คน ฉันกำลังมองหาคำตอบที่ซับซ้อนลึกมืดทั้งหมด ปรากฎว่าคุณสามารถทำสิ่งนี้ได้จากปลาโลมาตรงจากกระป๋อง ปลา: // ชื่อผู้ใช้ @ เซิร์ฟเวอร์: พอร์ต


ฉันไม่ได้รับมัน
Pierre.Vriens

ฉันไม่คิดว่าคุณเข้าใจกรณีใช้ของฉัน ฉันอยู่ในเซสชันบรรทัดคำสั่ง SSH ที่ใช้งานอยู่และต้องการส่งไฟล์กลับไปที่เครื่องคอมพิวเตอร์ของฉันจาก [อาจได้รับการยกเว้นคือไม่สามารถใช้งานผ่าน SFTP] มันอาจไม่ได้เป็นไฟล์ที่แหล่งกำเนิดมันอาจจะเป็นคำสั่งเอาท์พุท ฉันกำลังมองหาวิธีที่จะทำให้เป็นท่อโดยไม่ต้องสร้างไฟล์ตัวกลางและเริ่มเซสชัน SFTP / SCP / etc ใหม่
Oli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.