20/07/2019, 09:56

Tìm hiểu về SCP, SCP trong Ruby on Rails

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 đó; ...

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/

0