이번 포스팅에서는 독자들이 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에 연결하신 것을 축하드립니다!

보안성과 안정성을 극대화한 SFTP To Go
SFTP To Go는 관리형 SFTP/FTPS/S3를 서비스 형태로 제공하며, 최고의 안정성, 보안, 가용성, 1분 만에 설치가 가능하며 모든 규모의 기업에 적합합니다.
지금 바로 SFTP To Go를 사용해 보세요!

Github에서 더 많은 코드 샘플을 확인하세요.