이번 포스팅에서는 독자들이 SFTP 서버에 연결하고 이용하기 위한 Ruby on Rails 코드 작성에 익숙해지는 데 중점을 둘 것입니다. SFTP는 안전한 파일 및 데이터 전송을 목표로 일반적으로 사용되는 표준 보안 프로토콜입니다. 서버와의 연결을 설정할 때 완료해야 할 단계는 몇 가지뿐이며, 이 글을 다 읽었을 쯤이면 혼자서도 서버에 연결할 수 있을 것입니다.
요구사항
가장 먼저 할 일은 준비입니다. Ruby on Rails에서 SFTP 서버에 연결하고 이용하려면 net-sftp
gem이 필요합니다. 설치할 준비가 되면 수동으로 실행합니다:
gem install net-sftp
또는 Gemfile
파일을 생성하고 그 안에 종속성을 선언합니다:
gem 'net-sftp'
그리고 실행을 합니다:
bundle install
SFTP에 연결하기
이 글에서는 SFTP 서버에 연결하는 데 필요한 모든 정보를 URI 형식(sftp://user:password@host)으로 포함하는 SFTPTOGO_URL이라는 환경 변수를 사용하겠습니다. 이 변수는 URI.parse를 사용하여 URI 부분을 추출하기 위해 구문 분석되며, 원격 서버의 호스트 키는 기본적으로 ~/.ssh/known_hosts
를 사용하여 인증됩니다.
연결이 설정되면 SFTP 클라이언트 개체가 인스턴스 변수 @sftp_client
에 할당됩니다.
require 'net/sftp'
require 'uri'
class SFTPClient
def initialize(host, user, password)
@host = host
@user = user
@password = password
end
def connect
sftp_client.connect!
rescue Net::SSH::RuntimeError
puts "Failed to connect to #{@host}"
end
def disconnect
sftp_client.close_channel
ssh_session.close
end
def sftp_client
@sftp_client ||= Net::SFTP::Session.new(ssh_session)
end
private
def ssh_session
@ssh_session ||= Net::SSH.start(@host, @user, @password)
end
end
sftptogo_url = ENV['SFTPTOGO_URL']
begin
uri = URI.parse(sftptogo_url)
rescue URI::InvalidURIError
puts 'Bad SFTPTOGO_URL'
end
sftp = SFTPClient.new(uri.host, uri.user, password: uri.password)
sftp.connect
# disconnect
sftp.disconnect
파일 리스트 표시하기
이제 제대로 연결이 되었으므로 이를 사용하여 원격 SFTP 서버에 있는 파일을 나열할 수 있습니다. 이 작업은 경로 인수에 있는 파일에 해당하는 객체 배열을 반환하는 @sftp_client.dir.for_each
방법을 호출하여 수행합니다. 이 예제에서 래퍼 함수는 단순히 원격 경로에서 찾은 파일을 출력합니다.
def list_files(remote_path)
@sftp_client.dir.foreach(remote_path) do |entry|
puts entry.longname
end
end
파일 업로드 하기
다음 단계는 파일을 업로드하는 것입니다. sftp_client 객체의 upload
함수를 사용하여 로컬 파일 경로와 원격 경로(업로드 후 파일이 끝나는 위치와 동일)를 전달합니다. 함수 호출은 다음과 같습니다:@sftp_client.upload!("./local.txt", "./remote.txt")
def upload_file(local_path, remote_path)
@sftp_client.upload!(local_path, remote_path)
puts "Uploaded #{local_path}"
end
파일 다운로드 하기
프로세스가 완료되면 파일을 다운로드하기만 하면 됩니다. sftp_client 객체의 download
함수를 사용하고 원격 파일의 경로와 다운로드한 파일을 저장할 로컬 경로를 전달합니다. 다음과 같이 함수를 호출하면 됩니다: @sftp_client.download("./remote.txt", "./download.txt")
def download_file(remote_path, local_path)
@sftp_client.download!(remote_path, local_path)
puts "Downloaded #{remote_path}"
end
정리하자면
다 끝났습니다! 전체 프로그램을 처음부터 끝까지 실행하려면 다음 코드를 복사하여 main.rb
로 저장하세요:
require 'net/sftp'
require 'uri'
class SFTPClient
def initialize(host, user, password)
@host = host
@user = user
@password = password
end
def connect
sftp_client.connect!
rescue Net::SSH::RuntimeError
puts "Failed to connect to #{@host}"
end
def disconnect
sftp_client.close_channel
ssh_session.close
end
def upload_file(local_path, remote_path)
@sftp_client.upload!(local_path, remote_path)
puts "Uploaded #{local_path}"
end
def download_file(remote_path, local_path)
@sftp_client.download!(remote_path, local_path)
puts "Downloaded #{remote_path}"
end
def list_files(remote_path)
@sftp_client.dir.foreach(remote_path) do |entry|
puts entry.longname
end
end
def sftp_client
@sftp_client ||= Net::SFTP::Session.new(ssh_session)
end
private
def ssh_session
@ssh_session ||= Net::SSH.start(@host, @user, @password)
end
end
sftptogo_url = ENV['SFTPTOGO_URL']
begin
uri = URI.parse(sftptogo_url)
rescue URI::InvalidURIError
puts 'Bad SFTPTOGO_URL'
end
sftp = SFTPClient.new(uri.host, uri.user, password: uri.password)
sftp.connect
# list files in directory
sftp.list_files('/path/to/remote')
# upload files
sftp.upload_file('/path/to/local', '/path/to/remote')
# download files
sftp.download_file('/path/to/remote', '/path/to/local')
# disconnect
sftp.disconnect
마지막으로 다음 명령을 사용하여 실행합니다:
ruby main.rb
Ruby on Rails을 사용하여 SFTP에 연결하신 것을 축하드립니다!
Github에서 더 많은 코드 샘플을 확인하세요.