ใช้ scp เพื่อถ่ายโอนไฟล์จากโลคัลไดเร็กทอรี X ไปยังรีโมตไดเร็กทอรี Y


99

ฉันลองดูคำถามอื่น ๆ ที่นี่และในบทแนะนำ "การใช้งาน scp" บนอินเทอร์เน็ต แต่ฉันไม่สามารถแยกแยะสิ่งที่ผิด

ฉันใช้ Linux Mint และฉันพยายามหาวิธีการทำงานของscp

ฉันเป็นไฟล์file.ext (บนคอมพิวเตอร์ของฉัน) ในไดเรกทอรี/ home / name / dir /

ฉันเชื่อมต่อกับเครื่องระยะไกลโดยใช้sshเช่น:

ssh -p 2222 username@domain

มันถามรหัสผ่านและเชลล์แสดง:

username@domain ~ $

ตอนนี้ถ้าฉันออกคำสั่ง (ก่อนที่ฉันจะเรียกใช้ ssh ฉันอยู่ในไดเรกทอรีท้องถิ่น / home / ชื่อ / dir ):

scp -r -P 2222 file.ext username@domain 

ผลลัพธ์คือ:

cp: cannot stat ‘file.ext’: No such file or directory

ผลเหมือนกันถ้าแทนที่จะเป็น file.ext ฉันเขียนเส้นทางที่สมบูรณ์

scp -r -P 2222 /home/name/dir/file.ext username@domain 

นอกจากนี้ผู้ดูแลเซิร์ฟเวอร์บอกฉันว่าฉันจะอัปโหลดไฟล์ไปยังไดเรกทอรีบ้านระยะไกลของฉัน (แทนรูท) เช่น:

scp -r -P 2222 file.ext username@domain:~/

แต่เมื่อฉันทำมันและกด "Enter" ไม่มีอะไรเกิดขึ้นเช่นถ้าเปลือกกำลังรอการป้อนข้อมูลเพิ่มเติม

สรุปปัญหาของฉัน:

  • cp: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
  • เชลล์ "ค้าง" บน ~ /

ข้อเสนอแนะใด ๆ


ไม่ชัดเจนว่าปัญหาของคุณเกี่ยวข้องกับการใช้งานเครื่องผิดหรือไม่ ... คุณช่วยนำหน้าแต่ละคำสั่งกับโฮสต์ที่คุณกำลังใช้งานได้หรือไม่? เช่นlocaluser@machineA: ssh -p 2222 username@domain(เพื่อระบุว่าคุณกำลังใช้งานคำสั่ง ssh เป็น localuser บน machineA)
umläute

1
เมื่อใช้scpงานรีโมตจะต้องมีโคลอน (เช่นremotehost:/tmp) มิฉะนั้นจะทำสำเนาธรรมดา ( scp /tmp/foo.txt example.comจะคัดลอก/tmp/foo.txtไปยังไฟล์โลคอลexample.com)
umläute

ลบ-rแฟ
ล็

คุณกำลังออกคำสั่ง scp ภายในเซสชัน ssheหรือไม่ มันจะสมเหตุสมผลถ้าคุณอยู่ในเครื่องท้องถิ่น
อเล็กซิส

คำตอบ:


119

คุณต้องรันscpคำสั่งจากเครื่องโลคัลไม่ใช่บนรีโมต คุณไม่จำเป็นต้องssh:

dragonmnl@local $ scp -P 2222 file.ext username@domain:~/ 

คุณไม่ต้องการ-r:

 -r      Recursively copy entire directories.  

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

username@domain $ scp dragonmnl@local:/path/to/file.ext ~/

1
ขอบคุณ ปัญหาคือฉันพยายามเรียกใช้ scp ภายในเซสชัน ssh ตอนนี้มันใช้งานได้!
dragonmnl

28

ฉันมีวิธีการโหลดไฟล์ขึ้น / ลงสองวิธีระหว่างรีโมทและเครื่องโลคัล (ฉันใช้เครื่อง Mac):

ในกรณีนี้ฉันต้องการขึ้น / ลง "11.jpeg" ระหว่าง local และ remote:

1

คัดลอกไฟล์ในบริการไปยัง dir ท้องถิ่น: คุณต้องอยู่ใน terminal bash ท้องถิ่นเพื่อดำเนินการคำสั่งนี้ไม่ใช่เมื่อคุณอยู่ใน ssh!

scp username@domain:/home/xxx/xxx/11.jpeg /Users/username/Desktop/  

คัดลอกไฟล์ในท้องถิ่น dir ไปยังบริการระยะไกล: นอกจากนี้คุณจะต้องอยู่ใน terminal ทุบตีท้องถิ่น

scp /Users/username/Desktop/11.jpeg username@domain:/home/xxx/xxx
  1. เพื่อให้บรรลุความตั้งใจเดียวกันเมื่อคุณเข้าสู่ระบบ SSHคุณต้องตั้งค่า "การตั้งค่าระบบ> การแชร์> การเข้าสู่ระบบจากระยะไกล> ผู้ใช้ทั้งหมดก่อน (ฉันไม่แน่ใจว่าคุณต้องตั้งค่าเป็น" ผู้ใช้ทั้งหมด "หรือไม่ )” Mac จะแจ้งให้คุณทราบ "หากต้องการลงชื่อเข้าใช้คอมพิวเตอร์เครื่องนี้จากระยะไกลให้พิมพ์: ssh username @ xxxxxx จากนั้นพิมพ์คำสั่งด้านล่าง:

    ชื่อผู้ใช้ scp @ domain: /home/xxx/xxx/11.jpeg ชื่อผู้ใช้ @ xxxxxx: / ผู้ใช้ / ชื่อผู้ใช้ / Desktop /

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


ในที่สุดฉันพบว่า Filezilla น่าจะเป็นงานที่สะดวกที่สุดในการทำงานประจำวัน ~~
maizer

5

หากคุณกำลังเรียกใช้คำสั่ง scp นี้บนเครื่องระยะไกลมันกำลังมองหาfile.extไฟล์ "ท้องถิ่น" เช่นบนเครื่องระยะไกล

ในการคัดลอกไฟล์จากเครื่องระยะไกลไปยังไฟล์ในเครื่องให้ใช้scp -P 2222 username@domain:dir/file.ext localdir(สมมติว่าfile.extมีอยู่ใน~/dirคอมพิวเตอร์ระยะไกลเช่นในตัวอย่างของคุณ) หากคุณเรียกใช้scpบนเครื่องระยะไกลให้ย้อนกลับ "local" และ "remote"


1
OP ต้องการคัดลอกจากโลคัลไปยังรีโมตดูที่ชื่อของ OP
terdon

โอ๊ะฉันคิดว่าคุณพูดถูก แต่เขาก็เห็นได้ชัดว่าการทำมันไปข้างหลัง ...
อเล็กซิส

3

ใช้scpคำสั่ง

หากคุณต้องการถ่ายโอนโฟลเดอร์zipก่อนอื่นเราสามารถทำได้unzipในภายหลัง

จากคอมพิวเตอร์ของคุณให้เรียกใช้สิ่งนี้:

$ scp your_path_to_the_file/the_file root@10.145.198.100:~/

นี่rootคือบัญชีของคุณและ10.145.198.100เป็นที่อยู่ IP ของเซิร์ฟเวอร์ระยะไกล เรากำลังจะคัดลอกthe_fileไปยัง~/โฟลเดอร์ในระยะไกล

Unzip ไฟล์:

$ unzip the_zip_file.zip -d destination_folder

ทำไมrootถึงต้องมีการเข้าถึง SSH บนเครื่องระยะไกล มันค่อนข้างไม่ปลอดภัย ดีกว่าที่จะใช้การใช้งานปกติแล้วsudoทำสิ่งใดก็ตามที่รูทต้องทำบนเครื่องนั้น
Kusalananda

1

เป็นเพียงการช่วยเหลือเล็กน้อยอาจช่วยให้ผู้เริ่มต้นอย่างฉัน: เส้นทางไปยังไดเรกทอรีระยะไกลควรเขียนดังนี้: username@domain:~/remote_directory

สิ่งที่ฉันต้องการเน้นที่นี่คือเราควรเพิ่มที่ :~/


0

โซลูชันสำหรับคัดลอกไฟล์จากLinux clientไปยังLinux Server

  1. ตรวจสอบว่าsshdเซิร์ฟเวอร์ของคุณใช้อยู่หรือไม่: ps aux | grep sshd

  2. หากไม่ได้ติดตั้งOpenSSHโดยใช้ sudo apt-get install openssh-server openssh-client https://www.tecmint.com/install-openssh-server-in-linux/

  3. รีสตาร์ทเซิร์ฟเวอร์ของคุณและตรวจสอบว่าsshdใช้งานอยู่ ps aux | grep sshd

  4. หากคุณต้องการคุณสามารถกำหนดค่า/etc/ssh/sshd_configไฟล์ของคุณแต่ไม่จำเป็นสำหรับการกำหนดค่าอย่างง่าย

  5. ตรวจสอบว่าพอร์ตเปิดอยู่โดยใช้ netcat nc -v -z 127.0.0.1 22

  6. ในการคัดลอกไฟล์จากLinuxไคลเอนต์ไปยังไคลเอนต์ให้Linuxใช้ scp ดังนี้ scp ~/filename.md username@10.22.33.45:~/folder/filename.md

  7. เพื่อตรวจสอบว่าไฟล์นั้นถูกคัดลอกมาใช้ ssh username@10.22.33.45และให้รหัสผ่านของคุณ

วิธีการคัดลอกไฟล์จากLinux clientไปยัง `Windows

  1. มีไคลเอนต์หลายตัวสำหรับการเรียกใช้เซิร์ฟเวอร์ SSH บน Windows เช่น OpenSSH จาก MS

    MobaSSH

    Bitvise SSH เซิร์ฟเวอร์

  2. ติดตั้งหนึ่งในเซิร์ฟเวอร์ด้านบนและตรวจสอบให้แน่ใจว่าพอร์ต 22 เปิดใช้งานอยู่

    ไฟร์วอลล์ advfirewall netsh เพิ่มชื่อกฎ = "SSH พอร์ต 22" dir = ในการดำเนินการ = อนุญาตโปรโตคอล = UDP localport = 22

    ไฟร์วอลล์ advfirewall netsh เพิ่มชื่อกฎ = "SSH พอร์ต 22" dir = การกระทำออก = อนุญาตโปรโตคอล = UDP localport = 22

    ไฟร์วอลล์ advfirewall netsh เพิ่มชื่อกฎ = "SSH พอร์ต 22" dir = ในการดำเนินการ = อนุญาตให้โปรโตคอล = TCP localport = 22

    ไฟร์วอลล์ advfirewall netsh เพิ่มชื่อกฎ = "SSH พอร์ต 22" dir = การกระทำออก = อนุญาตให้โพรโทคอล = TCP localport = 22

    advfirewall netsh ตั้งค่าสถานะ allprofiles

  3. การเปรียบเทียบเซิร์ฟเวอร์เหล่านี้:

    Bitvise SSH เซิร์ฟเวอร์

    1. จัดเตรียมเกือบจะใกล้เคียงกับ native cmdprompt, powershellprompt, autocompletion

    2. ให้ความสามารถเพิ่มเติมสำหรับการปรับแต่งหากคุณต้องการการใช้งานขั้นสูง

    3. การปรับแต่งของผู้ใช้สำหรับความต้องการอย่างง่ายคือ 0 ฉันเริ่มใช้งานได้ภายใน 2 นาทีหลังจากใช้เวลาพยายามMobaSSHและ OpenSSHทำงาน

    4. ในการคัดลอกไฟล์โดยใช้ scp ให้ทำดังนี้ scp ~/filename.md username@10.33.44.45:/C/Users/username/filename.md

    5. ฟรีสำหรับการใช้งานส่วนตัว $ 99 สำหรับการใช้งานระดับมืออาชีพ เนื่องจากคุณสมบัติมากมายและการรวมที่ยอดเยี่ยมราคาจึงคุ้มค่ากับเงินที่จ่าย

    MobaSSH:

    1. มีเปลือก Linux บน windows ที่คำสั่ง Linux ง่ายเช่นls, cp, findฯลฯ การทำงานคล้ายกับMINGW64

    2. คุณสามารถเข้าถึงcmdและpowershellโดยตรงโดยการพิมพ์cmdหรือ powershell

    3. การสนับสนุน Unicode ไม่ดี การเข้ารหัสไม่ถูกต้อง ตัวอย่างเช่นถ้าคุณพยายามที่จะเริ่มPythonล่ามมันจะผิดพลาด คุณจะต้องเปลี่ยนการเข้ารหัสด้วยตนเองโดยใช้ ( https://stackoverflow.com/a/12834315/4752883 ): chcp 65001 set PYTHONIOENCONDING=utf-8 จากนั้นเริ่มต้นพรอมต์ Python

    4. สิ่งที่ดีเกี่ยวกับ MobaSSH ก็คือมันมีส่วนต่อประสานผู้ใช้ที่เรียบง่ายscpและsshและรวมเข้าด้วยกัน ดังนั้นจะทำงานสำหรับกรณีใช้งานง่าย

    5. ในการคัดลอกไฟล์จากLinuxไคลเอนต์ไปยังWindowsเซิร์ฟเวอร์ที่ทำงาน MobaSSH: ใช้ scp ~/filename.md username@10.33.44.45:/cygdrive/c/Users/username/filename.md นี่เป็นเพราะMobaSSHขึ้นอยู่กับcygwinและไดรฟ์ของมันจะถูกแมปไปยังวิธีเดียวกันcygwin-s ไดรฟ์ถูกแมป

    ใช้ VMs จาก Microsoft ที่ติดตั้ง OpenSSHv6.7 จากhttps://developer.microsoft.com/en-us/microsoft-edge/tools/vms/ติดตั้ง OpenSSHv6.7 แล้ว

    1. มันมีค่ามากและคุณจะต้องปรับแต่งมันอย่างมาก

    2. ความสมบูรณ์ของคำสั่งใช้ไม่ได้

    3. มันจะเว้นช่องว่างเมื่อคุณย้ายเคอร์เซอร์บนเครื่อง

    4. Python ไม่ทำงาน

    5. OpenSSH รุ่นที่ใหม่กว่าอาจได้รับการปรับปรุง MS เพิ่มเติมดูเหมือนว่าจะทำให้ OpenSSH พร้อมใช้งานผ่านOptional Features https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/


-1

หากคุณเกิดขึ้นกับ OSX ...

เมื่อฉันพยายามเรียกใช้ด้วยชื่อผู้ใช้ @ local: / file_directory ...

ฉันได้รับข้อผิดพลาดต่อไปนี้:

ssh: local: node name or service name not known

วิธีการแก้

สำหรับเครื่อง Mac ฉันต้องทำตามขั้นตอนต่อไปนี้เพื่อตั้งค่าในเครื่องssh:

'การตั้งค่าระบบ' -> 'อินเทอร์เน็ตและระบบเครือข่าย' -> 'การแชร์' -> เปิดใช้งาน 'การเข้าสู่ระบบระยะไกล'

จากนั้นให้ชื่อผู้ใช้ @ ที่อยู่ IP


-1

ฉันมีปัญหาเดียวกันนี้ในวันนี้บน MAC

พิมพ์คำสั่งต่อไปนี้:

scp /local-file-path/ /-remote-location-path/
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.