Có thể sử dụng các lệnh Unix để cp một tệp trong thư mục con của tôi vào một máy tính từ xa thông qua SSH không?


17

Tôi có một loạt các tệp phần mềm được tải xuống thư mục con ~/Downloadstrên máy tính cá nhân của mình. Tôi cũng đang sử dụng bash để kết nối từ xa với máy tính ssh.

Có thể chuyển tập tin này qua sshmáy tính từ xa không?


Câu hỏi đề cập đến một tệp số ít ( this file) và nhiều tệp ( a series of software files), giải pháp tốt nhất phụ thuộc vào việc bạn có một tệp đơn hay nhiều tệp.
dùng2768

Câu trả lời:


42

Bạn có thể muốn sử dụng scpcho mục đích này. Đây là một phương tiện an toàn để truyền tệp bằng giao thức SSH.

Ví dụ: để sao chép một tệp có tên yourfile.txttừ ~/Downloadsmáy tính từ xa, hãy sử dụng:

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

Bạn có thể xem thêm ví dụ ở đây .


5
Tôi nghĩ rsynccó thể cũng hoạt động tốt, bây giờ tôi nghĩ về nó
ShanZhengYang

1
rsync rất phức tạp đối với chỉ một hoặc một tay chứa đầy các tệp ...
Paebbels

14
@Paebbels Ngược lại, thay thế scpở trên bằng rsyncvà nó sẽ hoạt động tốt.
8bittree

Tôi có xu hướng sử dụng rsynccho tất cả mọi thứ, ngay cả các tệp đơn lẻ, vì nó "chỉ hoạt động" trong các trường hợp đơn giản và có thể hiệu quả hơn nhiều trong các trường hợp khác. Nếu sử dụng một trong hai scphoặc rsynctrên bất cứ điều gì chưa nén và / hoặc mã hóa, hãy nhớ bật tùy chọn nén trên ( -Ccho scp, -zhoặc --compresscho rsync). Trên thực tế, tôi bật nó theo thói quen - rất hiếm khi bạn gặp tình huống khiến mọi thứ chậm lại (có lẽ nếu bạn đang sử dụng thiết bị năng lượng thấp chậm với công suất CPI hạn chế như rPi).
David Spillett

37

Mặc dù scprõ ràng là công cụ phù hợp cho việc này, nhưng vì lý do nào đó bạn không thể sử dụng nó, bạn có thể làm một cái gì đó như sau từ máy cục bộ của mình để sao chép, giả sử, một cấu trúc thư mục vào máy từ xa:

tar -c . | ssh <remote> tar -x

Đây sẽ tarlà thư mục hiện tại trên máy cục bộ và ghi rằng thư tarmục stdoutđó sẽ được dẫn tới một sshlệnh trong đó nó sẽ thực thi một lệnh từ xa để gỡ bỏ tệp mà nó đọc từ đóstdin

Được chỉnh sửa để phản ánh nhận xét của Dietrich Epp về -f -việc mặc định trên cả kết thúc tạo và trích xuất, do đó không cần thiết phải chỉ định rõ ràng.


7
Bạn có thể muốn thêm một -C basedirđối số tarđể trích xuất ở đâu đó ngoài thư mục chính của bạn nếu bạn đang làm điều này.
Dougal

17

Nếu bạn muốn làm điều này nhiều hơn dịp hiếm hoi, tôi khuyên bạn nên gắn hệ thống tập tin từ xa sshfsnếu bạn đang sử dụng một Unix giống như hỗ trợ FUSE (Linux, * BSD, Mac OS X). Tạo một thư mục trong thư mục chính của bạn, giả sử, được gọi là ~ / remote-server:

    $ mkdir ~/remote-server

Sau đó gắn hệ thống tập tin từ xa với sshfs. Thay thế "mineerver.com" bằng tên máy chủ của máy từ xa và "tên thư mục từ xa" bằng thư mục bạn đang sử dụng trên hệ thống từ xa.

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

Khi điều này được thực hiện, thư mục từ xa là một phần của hệ thống tệp của bạn và bạn có thể sử dụng tất cả các công cụ bình thường của mình trên đó, bao gồm cp:

    $ cp ~/Downloads/your-files ~/remote-server

Nếu bạn chưa sshfscài đặt, bạn sẽ có thể cài đặt nó trên máy tính của mình bằng trình quản lý gói của bạn (tìm các gói có tên sshfshoặc fuse-sshfs). Để biết thêm thông tin, bạn có thể đọc một hướng dẫn trực tuyến .

Nhân tiện, đây là cách quản lý tập tin yêu thích của tôi trên các máy chủ từ xa. Tôi thường giữ một máy chủ sản xuất và hai máy chủ phát triển được gắn theo cách này và sử dụng quy trình duyệt tệp thông thường của tôi với chúng.


Và sau đó kiểm tra các tùy chọn sshfs nào sẽ giúp bạn hoàn thành công việc tốt nhất. Ví dụ: bắt đầu với ánh xạ ID người dùng / nhóm -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_other-Cđể nén nếu băng thông kém. Ngay khi nó hoạt động tốt, cá nhân tôi thêm các bí danh cho các lệnh để nhanh chóng gắn kết các hệ thống tập tin xa trên ssh. @Benjamin_Staton Tôi sẽ không sử dụng sudo hoặc root ở đây, không phải không có ánh xạ nhóm / người dùng phù hợp.
tuk0z

9

Lần đầu tiên, không có sự khác biệt thực sự giữa scp(sao chép ssh) và rsync.

Các lần chạy tiếp theo sẽ được hưởng lợi bởi rsync không sao chép các tệp đã tồn tại.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a cho tất cả các tập tin
  • -v cho dài dòng
  • -H cho "chỉ cần tìm ra các liên kết tượng trưng và làm điều đúng đắn"
  • sau đó đường dẫn nguồn và đích. Bạn có thể sử dụng ký tự đại diện trong nguồn hoặc chỉ đồng bộ hóa toàn bộ thư mục.

Các cờ hữu ích khác bao gồm:

  • --delete để xóa các tệp ở đích không còn tồn tại trên nguồn.
  • --dry-run để thử nghiệm - rất tiện dụng khi kết hợp với --delete.

Điều này cũng sẽ sử dụng sshcác khóa để thực hiện đăng nhập không mật khẩu, nếu bạn đã thiết lập chúng.

Khi kết thúc quá trình chạy, rsyncsẽ cho bạn biết nó đã nhanh hơn bao nhiêu lần so với việc sao chép lại một lần nữa.


1
-Hthực sự là đối với các liên kết cứng, nó dừng cùng một nội dung được gửi hai lần trở lên khi được liên kết vào nhiều nơi trong cấu trúc thư mục nguồn (nhưng có thể làm cho quá trình kém hiệu quả hơn đối với các cấu trúc thư mục lớn). nó không có tác dụng đối với các liên kết tượng trưng, ​​nhưng một số tùy chọn được bao gồm bởi -a/ --archivedo ảnh hưởng đến cách xử lý các liên kết tượng trưng.
David Spillett

4

Để thêm vào câu trả lời trên. Đôi khi tôi không chắc chắn chính xác về con đường từ xa. Trong những trường hợp này, sftptrước tiên tôi sử dụng để điều hướng đến vị trí được yêu cầu, sau đó sử dụng get hoặc put để thực sự tải xuống hoặc tải lên một tệp.

Nếu bạn cũng muốn giữ một cái gì đó luôn được đồng bộ hóa và thậm chí muốn thực thi cục bộ một số tệp được đặt trên máy từ xa, sshfshoạt động rất tốt.


-1

Tôi đang làm một cái gì đó rất giống với ssh. Tôi đã tạo một công cụ xây dựng tùy chỉnh cho Visual Studio và về cơ bản là có VS chạy lệnh ssh sao chép mã của tôi vào máy tính mục tiêu và sau đó biên dịch nó trên máy tính mục tiêu đó.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand '

Lưu ý việc sử dụng dấu ngoặc đơn và dấu chấm phẩy. Cái trước đóng gói các lệnh của bạn đến hostB thông qua ssh và cái sau cho phép bạn chạy nhiều lệnh hệ thống hostB trong một lệnh ssh từ hostA.

Để thực hiện công việc này, bạn sẽ cần thiết lập các khóa ssh trên máy bắt đầu để bạn có thể là userA @ hostA và đăng nhập vào hostB dưới dạng userB. Quá trình tạo khóa ssh công khai cho userA @ hostA được ghi lại rõ ràng. Nếu bạn không tạo khóa công khai trên hostA cho userA và sao chép khóa đó vào hostB dưới dạng userB, thì bạn sẽ buộc phải nhập mật khẩu của mình mỗi lần - điều này phá hỏng niềm vui tự động hóa.


Bất cứ ai hạ cấp có thể để lại nhận xét về lý do tại sao họ hạ cấp? Bỏ phiếu là vô nghĩa mà không có thông tin phản hồi. Cảm ơn. Tôi đã giải quyết câu hỏi cụ thể của OP bằng một câu trả lời liên quan trực tiếp. Tôi không giới thiệu công nghệ mới hoặc đề xuất các tuyến đường thay thế. Tại sao? có lẽ OP không muốn sử dụng các tuyến đường thay thế.
Andrew
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.