ฉันจะคัดลอกโฟลเดอร์จากระยะไกลไปยังเครื่องท้องถิ่นโดยใช้ scp ได้อย่างไร [ปิด]


2695

ฉันจะคัดลอกโฟลเดอร์จากระยะไกลไปยังโฮสต์ในพื้นที่ได้scpอย่างไร?

ฉันใช้sshเพื่อเข้าสู่ระบบเซิร์ฟเวอร์ของฉัน
จากนั้นผมอยากจะคัดลอกโฟลเดอร์ระยะไกลเพื่อท้องถิ่นfoo/home/user/Desktop

ฉันจะบรรลุสิ่งนี้ได้อย่างไร


61
คำถามของ OP คือการคัดลอกไฟล์จากรีโมตไปยังโลคอลโฮสต์ในขณะที่ ssh จะไปที่รีโมตโฮสต์หรือไม่ ฉันไม่แน่ใจว่าทำไมไม่มีคำตอบเดียวตอบคำถามของเขา / เธออย่างถูกต้อง
JeffDror

3
หลักฐานของคำถามไม่ถูกต้อง แนวคิดคือเมื่อล็อกอินเข้าสู่ ssh วิธีการย้ายไฟล์จากเครื่องที่ล็อกอินกลับไปยังไคลเอนต์ที่เข้าสู่ระบบอย่างไรก็ตาม scp ไม่รับรู้และไม่สามารถใช้การเชื่อมต่อ ssh ได้ มันทำให้การเชื่อมต่อของตัวเอง ดังนั้นวิธีแก้ปัญหาอย่างง่ายคือสร้างหน้าต่างเทอร์มินัลใหม่บนโลคัลเวิร์กสเตชันและเรียกใช้ scp ที่ถ่ายโอนไฟล์จากเซิร์ฟเวอร์ระยะไกลไปยังเครื่องท้องถิ่น เช่นผู้ใช้ scp -i key @ remote: / remote-dir / remote-file / local-dir / local-file
jeffmcneill

12
คำถามอาจไม่ได้อยู่ในหัวข้อ แต่เป็นโพสต์อันดับสูงสุดใน Google การล็อกหมายความว่าไม่มีใครสามารถอัปเดตเพื่อมอบวิธีแก้ปัญหาที่ดีกว่า
Alex Harvey

3
ฉันเพิ่งถามคำถามที่ "ลึกลงไปเล็กน้อย" ที่คล้ายกันเกี่ยวกับบรรทัดคำสั่งสำหรับเครื่องมืออื่นใน SuperUser และมันถูกย้ายโดย mods ที่นั่นไปยัง StackOverflow ยังไงก็ตามฉันเห็นด้วยกับการต่อสู้ของ mods: เราจะย้ายมันไปที่ SuperUser ได้ไหมและปลดล็อคและมีคำตอบเพิ่มเติมเข้ามาหรือไม่?
Nikhil VJ

3
โดยทั่วไปปฏิกิริยา "นอกหัวข้อ" ทั้งหมดใน stackoverflow เป็นข้อบกพร่องที่ใหญ่ที่สุดในแพลตฟอร์ม มาร์ตินส์ขยัน
AdamC

คำตอบ:


4937
scp -r user@your.server.example.com:/path/to/foo /home/user/Desktop/

โดยไม่รวมส่วนท้าย '/' ที่ส่วนท้ายของ foo คุณจะย้ายไดเรกทอรีเอง (รวมถึงเนื้อหา) มากกว่าเฉพาะเนื้อหาของไดเรกทอรี

จากman scp(ดูคู่มือออนไลน์ )

-r ซ้ำไดเรกทอรีทั้งหมด


1409
ฉัน google นี้ทุกครั้ง การ์ตูนที่เกี่ยวข้อง: xkcd.com/1168
cptloop

10
สองสิ่งที่ดีที่ฉันค้นพบ: -Cธงเพิ่มการบีบอัดและ-cธงช่วยให้คุณสามารถผ่านประเภทตัวเลขอื่น ๆ เพื่อประสิทธิภาพที่ดีขึ้นscp -c blowfish a@b:something . ดังที่เห็นในคำตอบของ dimuthu
Automatico

79
ใช้ -p เพื่อรักษาเวลาในการแก้ไขไฟล์, การอนุญาต, ฯลฯ ! scp ใช้ -pr @ ...
เบอร์

27
คำตอบนี้ไม่มีคำอธิบายที่สำคัญ คุณจะจบลงด้วยDesktop/fooหรือคุณจะมีDesktop/allcontentsofFooGohereSCP ดูเหมือนจะทำหน้าที่แปลก ๆ กับฉันมันทำสิ่งหนึ่งแล้วอีกอย่างหนึ่ง
Toskan

7
@Toskan กับคุณควรจะจบลงด้วยscp -r user@your.server.example.com:/path/to/foo /home/user/Desktop/ Desktop/fooด้วยscp -r user@your.server.example.com:/path/to/foo/. /home/user/Desktop/ คุณจะจบลงด้วยเนื้อหาของfooในDesktopและ dirs ย่อยทั้งหมดของfooเกลื่อนไปด้วยDesktop
Ioannis

307

ในการใช้พลังของSCPอย่างเต็มที่คุณต้องทำตามขั้นตอนต่อไปนี้:

  1. การอนุญาตกุญแจสาธารณะ
  2. สร้างนามแฝง ssh

จากนั้นยกตัวอย่างเช่นถ้าคุณมีนี้~ / .ssh / config :

Host test
    User testuser
    HostName test-site.com
    Port 22022

Host prod
    User produser
    HostName production-site.com
    Port 22022

คุณจะบันทึกตัวคุณเองจากการป้อนรหัสผ่านและทำให้ไวยากรณ์ของscp เป็นดังนี้:

scp -r prod:/path/foo /home/user/Desktop   # copy to local
scp -r prod:/path/foo test:/tmp            # copy from remote prod to remote test

ยิ่งไปกว่านั้นคุณจะสามารถใช้เส้นทางที่สำเร็จจากระยะไกลได้:

scp test:/var/log/  # press tab twice
Display all 151 possibilities? (y or n)

ปรับปรุง:

สำหรับการเปิดใช้งาน bash-completion สำเร็จจากระยะไกลคุณจำเป็นต้องมี bash-shell ทั้งบน<source>และ<target>โฮสต์และใช้งานได้อย่างสมบูรณ์ สำหรับข้อมูลเพิ่มเติมดูคำถามที่เกี่ยวข้อง:

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


12
ไม่ทราบเกี่ยวกับไฟล์ปรับแต่งนี่เจ๋งมาก!
dmastylo

การทำให้แท็บเสร็จสมบูรณ์ไร้สาระเพิ่งเสร็จสิ้นจากโฮสต์ในพื้นที่สำหรับฉัน
Bernhard

14
@ b.long คำถามคือ "วิธีคัดลอกโฟลเดอร์ระยะไกลไปยังโลคอลเดสก์ท็อป" คำตอบของฉันคือ"SCP -r แยง: เส้นทาง / / foo / home / ผู้ใช้ / สก์ท็อป" หวังว่าคุณจะสามารถเห็นความสัมพันธ์
Alexander Yancharuk

2
@Bernhard สำหรับฉันเป็นที่ชัดเจนเพราะฉันใช้ bash-shell ขอบคุณที่ชี้ให้ฉันเห็น! อัปเดตคำตอบแล้ว
Alexander Yancharuk

1
@Alexander Yancharuk: ขอบคุณสำหรับคำตอบนี้มีรายละเอียดมากกว่าแค่ครอบคลุมไวยากรณ์เพียงอย่างเดียว
Gladiator

217

ในการคัดลอกทั้งหมดจากท้องถิ่นที่อยู่ในการระยะไกลสถานที่ตั้ง (อัพโหลด)

scp -r /path/from/destination username@hostname:/path/to/destination

หากต้องการคัดลอกทั้งหมดจากระยะไกลไปยังตำแหน่งท้องถิ่น (ดาวน์โหลด)

scp -r username@hostname:/path/from/destination /path/to/destination

Custom Port โดยที่xxxxเป็นหมายเลขพอร์ตที่กำหนดเอง

 scp -r -P xxxx username@hostname:/path/from/destination /path/to/destination

คัดลอกในไดเรกทอรีปัจจุบันจากระยะไกลเป็นท้องถิ่น

scp -r username@hostname:/path/from/file .

ช่วยด้วย:

  1. -r คัดลอกไดเรกทอรีและไฟล์ทั้งหมดซ้ำ ๆ
  2. ใช้ตำแหน่งเต็มเสมอจากรับ/ตำแหน่งเต็มโดยpwd
  3. scp จะแทนที่ไฟล์ที่มีอยู่ทั้งหมด
  4. hostname จะเป็นชื่อโฮสต์หรือที่อยู่ IP
  5. หากจำเป็นต้องใช้พอร์ตที่กำหนดเอง (นอกเหนือจากพอร์ต 22) -P portnumber
  6. . (จุด) - หมายถึงไดเรกทอรีการทำงานปัจจุบันดังนั้นดาวน์โหลด / คัดลอกจากเซิร์ฟเวอร์และวางที่นี่เท่านั้น

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


1
ดูเหมือน (อย่างน้อยในรุ่นล่าสุดของ Raspbian Jessie และ Ubuntu) ที่ scp ใช้ -P (ตัวพิมพ์ใหญ่ P) สำหรับพอร์ตในขณะที่ (ผิดปกติ) ssh ใช้ -p (ตัวพิมพ์เล็ก)
Adam Plocher

-p ถูกสงวนไว้สำหรับการรักษา "เวลาการแก้ไขเวลาการเข้าถึงและโหมดจากไฟล์ต้นฉบับ" ดังนั้นหากคุณกำลังใช้พอร์ตนั้นอาจไม่ทำงาน ;-) เว้นแต่ว่าคุณจะมีเวอร์ชันอื่นที่ใช้ตัวพิมพ์เล็กแตกต่างกัน
Adam Plocher

ด้วย ssh ใช่ ไม่ใช่กับ scp (ฉันถือว่า)
Adam Plocher

ฉันควรใส่อะไรถ้าไดเรกทอรีมีช่องว่าง?
Brethlosze

@hyprfrcb ใช้pwdเพื่อรับตำแหน่งและใช้งานเหมือนกัน
Shiv Singh

48

สิ่งที่ฉันมักจะใช้คือ:

scp -r username@IP:/path/to/server/source/folder/  .

. (dot) : current folderมันหมายความว่า ดังนั้นคัดลอกจากเซิร์ฟเวอร์และวางที่นี่เท่านั้น

IP : อาจเป็นที่อยู่ IP 125.55.41.311หรืออาจเป็นโฮสต์ns1.mysite.comได้


9
ขอบคุณสำหรับการชี้ให้เห็นว่า.หมายถึงไดเรกทอรีปัจจุบัน!
ericmjl

35

ดีกว่าที่จะบีบอัดแคตตาล็อกครั้งแรกบนเซิร์ฟเวอร์ระยะไกล:

tar czfP backup.tar.gz /path/to/catalog

ประการที่สองดาวน์โหลดจากระยะไกล:

scp user@your.server.example.com:/path/to/backup.tar.gz .

ในตอนท้ายให้แตกไฟล์:

tar -xzvf backup.tar.gz

10
"ดีกว่า" ขึ้นอยู่กับข้อมูลที่คุณถ่ายโอนและความพยายามที่จะส่งไปยังเซิร์ฟเวอร์เพื่อทำการซิป / คลายซิป และคุณสามารถเพิ่มการบีบอัดเพื่อ SCP กับธงเช่น-C scp -C a@b:bigfile .
Automatico

4
สิ่งนี้ทำให้ฉันนึกถึงความคิดเห็นที่ทำโดย @cptloop! : D xkcd.com/1168
GoodSp33d

22

และถ้าคุณมีไฟล์หนึ่งไฟล์ให้ดาวน์โหลดจากที่ตั้งระยะไกลและถ้าคุณไม่ค่อยใส่ใจเรื่องความปลอดภัยลองเปลี่ยนการเข้ารหัสแบบเริ่มต้น scp (Triple-DES) ไปเป็นบางอย่างเช่น 'ปักเป้า'

นี่จะลดเวลาการคัดลอกไฟล์ลงอย่างมาก

scp -c blowfish -r user@your.server.example.com:/path/to/foo /home/user/Desktop/

2
ตามที่โพสต์บล็อกนี้คุณจะได้รับประสิทธิภาพการทำงานที่ดียิ่งขึ้นด้วยarcfourในสถานที่ของblowfishแต่มันก็มีข้อบกพร่องของการรักษาความปลอดภัย
Automatico

20

สถานการณ์ทั่วไป

scp -r -P port username@ip:/path-to-folder  .

อธิบายด้วยตัวอย่าง

scp -r -P 27000 abc@10.70.12.12:/tmp/hotel_dump .

ที่ไหน

port = 27000
username = "abc" , remote server username
path-to-folder = tmp/hotel_dump
. = current local directory

ขอบคุณสำหรับคำตอบ - P สำหรับพอร์ต SSH เฉพาะนั้นมีประโยชน์สำหรับฉัน
redoff

19

ไปที่ไฟล์บนแถบเครื่องมือเอกภาพของคุณ

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

กด Ctrl + l แล้วเขียน here_goes_your_user_name@192.168.10.123

192.168.1.103 เป็นโฮสต์ที่คุณต้องการเชื่อมต่อ

ตัวอย่างหนึ่งที่นี่

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


12

คำถามคือวิธีการคัดลอกโฟลเดอร์จากระยะไกลไปยังท้องถิ่นด้วยscpคำสั่ง

$ scp -r userRemote@remoteIp:/path/remoteDir /path/localDir

แต่นี่เป็นวิธีที่ดีกว่าสำหรับsftp- SSH File Transfer Protocol (เช่น Secure File Transfer Protocol หรือ SFTP) เป็นโปรโตคอลเครือข่ายที่ให้การเข้าถึงไฟล์การถ่ายโอนไฟล์และการจัดการไฟล์ผ่านสตรีมข้อมูลที่เชื่อถือได้ (wikipedia)

$ sftp user_remote@remote_ip

sftp> cd /path/to/remoteDir

sftp> get -r remoteDir

Fetching /path/to/remoteDir to localDir 100% 398 0.4KB/s 00:00

สำหรับความช่วยเหลือเกี่ยวกับsftpคำสั่งเพียงแค่พิมพ์หรือhelp?


12

ในกรณีที่คุณพบปัญหา"การตรวจสอบสิทธิ์ล้มเหลวมากเกินไป"ให้ระบุคีย์ SSH ที่คุณเพิ่มลงในเซิร์ฟเวอร์ ssh ของ severs:

scp -r -i /path/to/local/key user@remote.tld:/path/to/folder /your/local/target/dir

5

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

scp -r . root@888.888.888.888:/usr/share/nginx/www/example.org/

1
สมมติว่าผู้ใช้มีสิทธิ์คุณสามารถใช้พา ธ สัมบูรณ์โดยไม่ใช้root@
Jonathan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.