Khi làm việc với linux đã bao giờ bạn deploy một ứng dụng lên VPS và bạn muốn chuyển một file config trong source lên VPS chưa? Chắc hẵn rất nhiều người đã từng làm theo những cách như để file đó trong thư mục dự án và không để trong file .gitignore sau đó ở server VPS sẽ pull code về kèm file đó; hoặc có một cách khác là copy nội dung file đó rồi sang bên server VPS tạo file rồi copy nội dung vào. Nhưng giả sử file config đó quan trọng chưa các key quan trọng mà bạn không muốn đưa lên git hoặc phải chuyển nhiều file giữa hai máy thì các cách trên có vẻ không khả dụng. SCP (Secure Copy) là một công cụ dòng lệnh cho các hệ thống Linux để chuyển tập tin an toàn từ máy cục bộ sang máy chủ từ xa hoặc ngược lại SCP sử dụng giao thức SSH giữa các tập tin chuyển giao giữa hai hệ thống an toàn.
SSH server không được cài đặt theo mặc định trong Ubuntu nhưng nó có thể dễ dàng cài đặt. Để cài đặt SSH trên Ubuntu, chỉ cần qua các các bước sau:
sudo apt update sudo apt-get install openssh-server openssh-client
Để sử dụng, hai máy chủ cần đã thiết lập kết nối được với nhau qua ssh
2.1. Tải lên
Câu lệnh mặc định
scp source_file [email protected]_host:/destination_folder
VÍ dụ: đẩy file test.txt từ client lên server /home/
scp test.txt [email protected]:/home
- Khi sử dụng câu lệnh mặc định, người dùng sẽ không thấy gì trừ khi quá trình được thực hiện hoặc một số lỗi xuất hiện. Bạn có thể sử dụng thêm option -v để in thông tin debug vào màn hình. Nó có thể giúp bạn gỡ lỗi các vấn đề về kết nối, xác thực và cấu hình.
Ví dụ
[email protected] ~/Documents $ scp -v Label.pdf [email protected]:.
Output:
Executing: program /usr/bin/ssh host 202.x.x.x, user mrarianto, command scp -v -t . OpenSSH_6.0p1 Debian-3, OpenSSL 1.0.1c 10 May 2012 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug1: Connecting to 202.x.x.x [202.x.x.x] port 22. debug1: Connection established. debug1: Host '202.x.x.x' is known and matches the RSA host key. debug1: Found key in /home/pungki/.ssh/known_hosts:1 debug1: ssh_rsa_verify: signature correct debug1: Next authentication method: password [email protected]'s password: debug1: Authentication succeeded (password). Authenticated to 202.x.x.x ([202.x.x.x]:22). Sending file modes: C0770 3760348 Label.pdf Sink: C0770 3760348 Label.pdf Label.pdf 100% 3672KB 136.0KB/s 00:27 Transferred: sent 3766304, received 3000 bytes, in 65.2 seconds Bytes per second: sent 57766.4, received 46.0 debug1: Exit status 0
- Để hiển thị thời gian sửa đổi, thời gian truy cập và chế độ từ các tệp gốc ta sử dụng option -p . Ví dụ
[email protected] ~/Documents $ scp -p Label.pdf [email protected]:
Output:
[email protected]'s password: Label.pdf 100% 3672KB 126.6KB/s 00:29
- Thực hiện chuyển tập tin nhanh hơn bằng cách sử dụng option -C
Một trong những tham số có thể chuyển tập tin của bạn nhanh hơn là tham số -C. Tham số -C số sẽ nén các tệp của bạn khi đang di chuyển. Điều duy nhất là nén chỉ xảy ra trong mạng. Khi tệp được gửi đến máy chủ đích, nó sẽ trở về kích thước ban đầu như trước khi quá trình nén xảy ra. Lưu ý răng nhưng tập tin đã được rồi thì việc nén sẽ không còn tác dụng nữa, ví dụ các tập .rar .zip ... Ví dụ:
[email protected] ~/Documents $ scp -Cpv messages.log [email protected]:.
Executing: program /usr/bin/ssh host 202.x.x.x, user mrarianto, command scp -v -p -t . OpenSSH_6.0p1 Debian-3, OpenSSL 1.0.1c 10 May 2012 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug1: Connecting to 202.x.x.x [202.x.x.x] port 22. debug1: Connection established. debug1: identity file /home/pungki/.ssh/id_rsa type -1 debug1: Host '202.x.x.x' is known and matches the RSA host key. debug1: Found key in /home/pungki/.ssh/known_hosts:1 debug1: ssh_rsa_verify: signature correct debug1: Next authentication method: publickey debug1: Trying private key: /home/pungki/.ssh/id_rsa debug1: Next authentication method: password [email protected]'s password: debug1: Enabling compression at level 6. debug1: Authentication succeeded (password). Authenticated to 202.x.x.x ([202.x.x.x]:22). debug1: channel 0: new [client-session] debug1: Sending command: scp -v -p -t . File mtime 1323853868 atime 1380428748 Sending file timestamps: T1323853868 0 1380428748 0 Sink: T1323853868 0 1380428748 0 Sending file modes: C0600 97517300 messages.log messages.log 100% 93MB 602.7KB/s 02:38 Transferred: sent 8905840, received 15768 bytes, in 162.5 seconds Bytes per second: sent 54813.9, received 97.0 debug1: Exit status 0 debug1: compress outgoing: raw data 97571111, compressed 8806191, factor 0.09 debug1: compress incoming: raw data 7885, compressed 3821, factor 0.48
- Hạn chế sử dụng băng thông
Tham số -l sẽ giới hạn băng thông sử dụng. Sẽ rất hữu ích nếu bạn thực hiện sao chép nhiều tệp, nhưng bạn không muốn băng thông bị cạn kiệt bởi quy trình SCP. thì đây là một lựa chọn hữu ích.
Ví dụ:
[email protected] ~/Documents $ scp -l 400 Label.pdf [email protected]:. [email protected]'s password: Label.pdf 100% 3672KB 50.3KB/s 01:13
Giá trị 400 đằng sau tham số của -l có nghĩa là chúng tôi giới hạn băng thông cho quy trình SCP chỉ 50 KB / giây. Một điều cần nhớ là băng thông được chỉ định bằng Kilobits / giây (kbps). Nó có nghĩa là 8 bit bằng 1 byte. Trong khi SCP tính bằng Kilobyte / giây (KB / s). Vì vậy, nếu bạn muốn giới hạn băng thông của mình cho SCP tối đa chỉ 50 KB/s, bạn cần đặt nó thành 50 x 8 = 400.
- Chỉ định một cổng khi không phải cổng mặc định
Thông thường SCP đang sử dụng cổng 22 làm cổng mặc định. Nhưng vì lý do bảo mật, bạn có thể thay đổi cổng này sang cổng khác. Ví dụ, tôi đang sử dụng cổng 2249. Sau đó, lệnh sẽ như thế này.
[email protected] ~/Documents $ scp -P 2249 Label.pdf [email protected]:. [email protected]'s password: Label.pdf 100% 3672KB 262.3KB/s 00:14
- Sao chép tập tin trong thư mục
Đôi khi chúng ta cần sao chép thư mục và tất cả các tệp, thư mục bên trong nó. Sẽ tốt hơn nếu chúng ta có thể làm điều đó trong 1 lệnh. SCP điều đó bằng cách sử dụng tham số -r.
[email protected] ~/Documents $ scp -r documents [email protected]:. [email protected]'s password: Label.pdf 100% 3672KB 282.5KB/s 00:13 scp.txt 100% 10KB 9.8KB/s 00:00
Khi quá trình sao chép được thực hiện, tại máy chủ đích, bạn sẽ tìm thấy một thư mục có tên là "documents, với tất cả các tập tin, thư mục trong nó như ở trên máy client.
2.1. Tải xuống
Để download file, thư mục ở máy chủ về cũng rất dễ, có pháp sẽ là tương tự như là tải lên nhưng sẽ đổi bên giữa hai tham số trong lệnh
Ví dụ lệnh tải một file từ server về
scp [email protected]:/path/to/remotefile.zip /Local/Target/Destination
Ta có thể thấy bên nào nhận thì bên đó sẽ ở sau. Cũng tương tự như tải file lên các options cho tải xuống cũng được dùng với chức năng tương tự.
Net::SCP is a pure-Ruby implementation of the SCP protocol. Nó hoạt động trên SSH (và yêu cầu Net :: SSH library) và cho phép các tệp và cây thư mục được sao chép giữa máy tính và một máy chủ từ xa. Các chức năng chính bao gồm
- Chuyển tập tin hoặc toàn bộ cây thư mục đến hoặc đi một máy chủ từ xa thông qua SCP
- Có thể bảo toàn các thuộc tính tệp khi chuyển
- Có thể tải xuống các tệp trong bộ nhớ hoặc trực tiếp vào đĩa
- Hỗ trợ SCP URI's và OpenURI
Cài đặt
Bạn có thể sử dụng lệnh
gem install net-scp
hoặc thêm "net-scp" vào gem file rồi gõ "bundle install"
Cách dùng cơ bản
Tải một file lên server
Net::SCP.upload!("remote.host.com", "username", "/local/path", "/remote/path", :ssh => { :password => "password" })
Tải một file từ remote server
Net::SCP.download!("remote.host.com", "username", "/remote/path", "/local/path", :ssh => { :password => "password" })
Sử dụng kết nối liền mạch để tải nhiều file
Net::SCP.start("remote.host.com", "username", :password => "password") do |scp| # Tải một file đến remote server scp.upload! "/local/path", "/remote/path" # tải một file từ bộ nhớ in-memory buffer scp.upload! StringIO.new("some data to upload"), "/remote/path" # download nhiều file d1 = scp.download("/remote/path", "/local/path") d2 = scp.download("/remote/path2", "/local/path2") [d1, d2].each { |d| d.wait } end
Bài viết đã đưa ra khái niệm cơ bản của SCP và cách sử dụng của nó. Hi vọng sẽ giúp ích được mọi người trong công việc. Để hiểu hơn về cách sử dụng SCP trong rails có thể thao khảo doc của gem "net-scp" ở đây. Bài viết có tham khảo từ : https://www.tecmint.com/scp-commands-examples/