Làm cách nào để sao chép một thư mục từ xa sang cục bộ bằng scp? [đóng cửa]


2696

Làm cách nào để sao chép thư mục từ xa sang máy chủ cục bộ bằng cách sử dụng scp?

Tôi sử dụng sshđể đăng nhập vào máy chủ của tôi.
Sau đó, tôi muốn sao chép thư mục từ xa foosang cục bộ /home/user/Desktop.

Làm thế nào để tôi đạt được điều này?


61
Câu hỏi của OP là liệu có thể sao chép tệp từ xa sang máy chủ cục bộ trong khi ssh'd sang máy chủ từ xa không . Tôi không chắc tại sao không có câu trả lời duy nhất đã giải quyết chính xác câu hỏi của anh ấy / cô ấy.
JeffDror

3
Tiền đề của câu hỏi là không chính xác. Ý tưởng là, một khi đã đăng nhập vào ssh, làm thế nào để di chuyển các tệp từ máy đã đăng nhập trở lại máy khách đã đăng nhập. Tuy nhiên, scp không biết và cũng không thể sử dụng kết nối ssh. Nó đang tạo ra các kết nối của riêng mình. Vì vậy, giải pháp đơn giản là tạo một cửa sổ terminal mới trên máy trạm cục bộ và chạy scp để chuyển các tệp từ máy chủ từ xa sang máy cục bộ. Ví dụ: scp -i key user @ remote: / remote-dir / remote-file / local-dir / local-file
jeffmcneill

12
Câu hỏi có thể lạc đề, nhưng đây cũng là bài đăng được xếp hạng cao nhất trên Google. Khóa nó có nghĩa là không ai có thể cập nhật nó để cung cấp một giải pháp tốt hơn.
Alex Harvey

3
Gần đây tôi đã hỏi một câu hỏi "sâu hơn một chút" liên quan đến các dòng lệnh cho một công cụ khác trên SuperUser và nó đã được các mod ở đó chuyển sang StackOverflow. Dù sao, tôi đồng ý với sự tranh chấp của các mod: Chúng ta có thể DI CHUYỂN cái này cho SuperUser không và có mở khóa được không và có thêm câu trả lời không?
Nikhil VJ

3
Nói chung, toàn bộ phản ứng "ngoài chủ đề" trên stackoverflow là lỗ hổng lớn nhất đối với nền tảng. Martin quá nhiệt.
AdamC

Câu trả lời:


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

Bằng cách không bao gồm dấu '/' ở cuối foo, bạn sẽ tự di chuyển thư mục (bao gồm cả nội dung), thay vì chỉ nội dung của thư mục.

Từ man scp(Xem hướng dẫn trực tuyến )

-r Sao chép toàn bộ thư mục


1410
Tôi google cái này mỗi lần. Truyện tranh liên quan: xkcd.com/1168
cptloop

10
Tôi đã tìm thấy hai điều thú vị: -Ccờ thêm nén và -ccờ cho phép bạn chuyển qua các loại mật mã khác để có hiệu suất tốt hơn, như đã scp -c blowfish a@b:something . thấy trong câu trả lời của dimuthu
Automatico

79
sử dụng -p để duy trì thời gian sửa đổi tập tin, quyền, vv! người dùng scp -pr @ ...
Ber

27
Câu trả lời này thiếu lời giải thích quan trọng. Bạn sẽ kết thúc với Desktop/foohoặc bạn sẽ có Desktop/allcontentsofFooGoherescp đôi khi hành động kỳ lạ với tôi nó làm điều này sau đó làm điều khác
Toskan

7
@Toskan với scp -r user@your.server.example.com:/path/to/foo /home/user/Desktop/bạn nên kết thúc với Desktop/foo. Với scp -r user@your.server.example.com:/path/to/foo/. /home/user/Desktop/ bạn, bạn sẽ kết thúc với nội dung footrong Desktopvà tất cả các thư mục con của foorải rác dướiDesktop
Ioannis

307

Để sử dụng toàn bộ sức mạnh của scp, bạn cần trải qua các bước tiếp theo:

  1. Ủy quyền khóa công khai
  2. Tạo bí danh ssh

Sau đó, ví dụ nếu bạn có cái này ~ / .ssh / config :

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

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

bạn sẽ tự cứu mình khỏi mục nhập mật khẩu và đơn giản hóa cú pháp scp như thế này:

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

Hơn nữa, bạn sẽ có thể sử dụng hoàn thành đường dẫn từ xa:

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

Cập nhật:

Để cho phép hoàn thành bash từ xa, bạn cần phải có bash-shell trên cả hai <source><target>máy chủ, và hoàn thành bash-làm việc đúng cách. Để biết thêm thông tin xem các câu hỏi liên quan:

Làm cách nào để bật tự động hoàn thành cho các đường dẫn từ xa khi sử dụng scp?
Hoàn thành tab tên tệp SCP


12
Không biết về tập tin cấu hình, điều này thật tuyệt vời!
dmastylo

Hoàn thành tab là vô nghĩa, chỉ cần hoàn thành từ máy chủ lưu trữ cục bộ cho tôi.
Bernhard

14
@ b.long Câu hỏi là "Cách sao chép thư mục từ xa vào máy tính cục bộ". Câu trả lời của tôi là "scp -r prod: / path / foo / home / user / Desktop" . Hy vọng bạn có thể thấy quan hệ.
Alexander Yancharuk

2
@Bernhard Đối với tôi là hiển nhiên vì tôi đang sử dụng bash-shell. Cảm ơn đã chỉ cho tôi về điều đó! Trả lời cập nhật.
Alexander Yancharuk

1
@Alexander Yancharuk: Cảm ơn câu trả lời, đây là chi tiết hơn là chỉ bao gồm cú pháp.
Đấu sĩ

217

Để sao chép tất cả từ Vị trí địa phương sang Vị trí từ xa (Tải lên)

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

Để sao chép tất cả từ Vị trí từ xa sang Vị trí địa phương (Tải xuống)

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

Cổng tùy chỉnh trong đó xxxxlà số cổng tùy chỉnh

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

Sao chép vào thư mục hiện tại từ Remote sang Local

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

Cứu giúp:

  1. -r Đệ quy sao chép tất cả các thư mục và tập tin
  2. Luôn sử dụng vị trí đầy đủ từ /, Nhận vị trí đầy đủ theopwd
  3. scp sẽ thay thế tất cả các tập tin hiện có
  4. hostname sẽ là tên máy chủ hoặc địa chỉ IP
  5. nếu cần cổng tùy chỉnh (ngoài cổng 22), hãy sử dụng -P portnumber
  6. . (dấu chấm) - nó có nghĩa là thư mục làm việc hiện tại, vì vậy chỉ cần tải xuống / sao chép từ máy chủ và dán vào đây.

Lưu ý: Đôi khi cổng tùy chỉnh sẽ không hoạt động do cổng không được phép trong tường lửa, vì vậy hãy đảm bảo rằng cổng tùy chỉnh được phép trong tường lửa cho kết nối đến và đi


1
Dường như (ít nhất là trong các phiên bản gần đây của Raspbian Jessie và Ubuntu) rằng scp sử dụng -P (chữ hoa P) cho cổng, trong khi (lẻ) ssh sử dụng -p (chữ thường).
Adam Plocher

-p được dành riêng để bảo toàn "thời gian sửa đổi, thời gian truy cập và chế độ từ tệp gốc". Vì vậy, nếu bạn đang sử dụng cổng đó, có lẽ nó không hoạt động ;-) Trừ khi bạn có một phiên bản khác sử dụng chữ thường p khác nhau.
Adam Plocher

Với ssh, vâng. Không phải với scp (tôi giả sử).
Adam Plocher

Tôi nên đặt gì nếu thư mục chứa một khoảng trắng?
Brethlosze

@hyprfrcb Sử dụng pwdđể có được vị trí và sử dụng tương tự
Shiv Singh

48

Những gì tôi luôn luôn sử dụng là:

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

. (dấu chấm) : nó có nghĩa current folder. vì vậy chỉ sao chép từ máy chủ và dán ở đây.

IP : có thể là một địa chỉ IP như 125.55.41.311hoặc nó có thể là máy chủ lưu trữ như thế nào ns1.mysite.com.


9
Cảm ơn bạn đã chỉ ra rằng .đề cập đến thư mục hiện tại!
ericmjl

35

Tốt hơn để nén danh mục đầu tiên trên máy chủ từ xa:

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

Thứ hai, tải xuống từ xa:

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

Cuối cùng, giải nén các tập tin:

tar -xzvf backup.tar.gz

10
"Tốt hơn" phụ thuộc rất nhiều vào dữ liệu bạn đang chuyển và nỗ lực để ssh đến máy chủ để thực hiện nén / giải nén. Và: bạn có thể thêm nén vào scp với -Ccờ, như thế nào scp -C a@b:bigfile ..
Automatico

4
Điều này nhắc nhở tôi về nhận xét được thực hiện bởi @cptloop! : D xkcd.com/1168
GoodSp33d

22

Và nếu bạn có một tệp tải xuống từ địa điểm từ xa và nếu bạn không quan tâm nhiều đến bảo mật, hãy thử thay đổi mã hóa mặc định scp (Triple-DES) thành một cái gì đó như 'blowfish'.

Điều này sẽ giảm thời gian sao chép tập tin quyết liệt.

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

2
Theo bài đăng trên blog này, bạn có được hiệu suất thậm chí tốt hơn arcfourthay vì blowfish, nhưng nó có lỗi bảo mật.
Automatico

20

Kịch bản điển hình,

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

giải thích với một mẫu,

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

Ở đâu,

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

Cảm ơn bạn đã trả lời. -P cho một cổng SSH cụ thể là hữu ích cho tôi.
đổi lại

19

Chuyển đến Tệp trên thanh công cụ thống nhất của bạn

nhập mô tả hình ảnh ở đây

Nhấn Ctrl + l và viết vào đây_goes_your_user_name@192.168.10.123

192.168.1.103 là máy chủ mà bạn muốn kết nối.

Đây là một ví dụ

nhập mô tả hình ảnh ở đây


12

Câu hỏi là làm thế nào để sao chép một thư mục từ xa sang cục bộ bằng scplệnh.

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

Nhưng đây là cách tốt hơn để thực hiện với sftp- Giao thức truyền tệp SSH (cũng là Giao thức truyền tệp an toàn hoặc SFTP) là giao thức mạng cung cấp quyền truy cập tệp, truyền tệp và quản lý tệp qua bất kỳ luồng dữ liệu đáng tin cậy nào. (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

Để được giúp đỡ về sftplệnh chỉ cần gõ helphoặc ?.


12

Trong trường hợp bạn gặp phải "Quá nhiều lỗi xác thực" , hãy chỉ định khóa SSH chính xác mà bạn đã thêm vào máy chủ ssh sever của mình:

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

5

Tôi không biết tại sao nhưng tôi đã phải sử dụng thư mục cục bộ trước khi có chỉ thị của máy chủ nguồn. Để làm cho nó hoạt động

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

1
Giả sử người dùng có quyền, bạn có thể thực hiện một đường dẫn tuyệt đối mà không cần sử dụngroot@
Jonathan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.