Spec-Zone.ru › Ruby 2.7

класс Net::FTP

Родитель:
Protocol
Включенные модули:
OpenSSL, OpenSSL::SSL

Этот класс реализует протокол File передачи файлов. Если вы использовали программу командной строки FTP и знакомы с её командами, то вам будет легко использовать этот класс. В него также включены некоторые дополнительные возможности, учитывающие стиль и преимущества Ruby.

Пример

require 'net/ftp'

Пример 1

ftp = Net::FTP.new('example.com')
ftp.login
files = ftp.chdir('pub/lang/ruby/contrib')
files = ftp.list('n*')
ftp.getbinaryfile('nif.rb-0.91.gz', 'nif.gz', 1024)
ftp.close

Пример 2

Net::FTP.open('example.com') do |ftp|
  ftp.login
  files = ftp.chdir('pub/lang/ruby/contrib')
  files = ftp.list('n*')
  ftp.getbinaryfile('nif.rb-0.91.gz', 'nif.gz', 1024)
end

Основные методы

Ниже приведены методы, которые, скорее всего, будут полезны пользователям:

  • FTP.open

  • getbinaryfile

  • gettextfile

  • putbinaryfile

  • puttextfile

  • chdir

  • nlst

  • size

  • rename

  • delete

Константы

CASE_DEPENDENT_PARSER
CASE_INDEPENDENT_PARSER
DECIMAL_PARSER
FACT_PARSERS
OCTAL_PARSER
TIME_PARSER

Атрибуты

binary[R]

При true, передачи выполняются в двоичном режиме. По умолчанию: true.

debug_mode[RW]

При true, весь трафик к серверу и от него записывается в +$stdout+. По умолчанию: false.

last_response[R]

Последний ответ сервера.

last_response_code[R]

Код последнего ответа сервера.

lastresp[R]

Код последнего ответа сервера.

open_timeout[RW]

Количество секунд ожидания открытия соединения. Можно использовать любое число, включая числа с плавающей точкой для дробных секунд. Если объект FTP не может открыть соединение в течение этого времени, он генерирует исключение Net::OpenTimeout. Значение по умолчанию — nil.

passive[RW]

При true, соединение находится в пассивном режиме. По умолчанию: true.

read_timeout[R]

Количество секунд ожидания чтения одного блока (через вызов read(2)). Можно использовать любое число, включая числа с плавающей точкой для дробных секунд. Если объект FTP не может прочитать данные в течение этого времени, он генерирует исключение Timeout::Error. Значение по умолчанию — 60 секунд.

resume[RW]

Устанавливает или извлекает состояние resume, определяющее, возобновляются ли неполные передачи или перезапускаются. По умолчанию: false.

ssl_handshake_timeout[RW]

Количество секунд ожидания рукопожатия TLS. Можно использовать любое число, включая числа с плавающей точкой для дробных секунд. Если объект FTP не может завершить рукопожатие TLS в течение этого времени, он генерирует исключение Net::OpenTimeout. Значение по умолчанию — nil. Если ssl_handshake_timeout — nil, используется open_timeout вместо него.

welcome[R]

Приветственное сообщение сервера.

Публичные методы класса

default_passive() Показать исходный код
# File lib/net/ftp.rb, line 151
def self.default_passive
  @@default_passive
end

По умолчанию соединения находятся в пассивном режиме. Значение по умолчанию: true.

default_passive=(value) Показать исходный код
# File lib/net/ftp.rb, line 145
def self.default_passive=(value)
  @@default_passive = value
end

По умолчанию соединения находятся в пассивном режиме. Значение по умолчанию: true.

Net::FTP.new(host = nil, options = {}) Показать исходный код
# File lib/net/ftp.rb, line 211
def initialize(host = nil, user_or_options = {}, passwd = nil, acct = nil)
  super()
  begin
    options = user_or_options.to_hash
  rescue NoMethodError
    # for backward compatibility
    options = {}
    options[:username] = user_or_options
    options[:password] = passwd
    options[:account] = acct
  end
  @host = nil
  if options[:ssl]
    unless defined?(OpenSSL::SSL)
      raise "SSL extension not installed"
    end
    ssl_params = options[:ssl] == true ? {} : options[:ssl]
    @ssl_context = SSLContext.new
    @ssl_context.set_params(ssl_params)
    if defined?(VerifyCallbackProc)
      @ssl_context.verify_callback = VerifyCallbackProc
    end
    @ssl_context.session_cache_mode =
      OpenSSL::SSL::SSLContext::SESSION_CACHE_CLIENT |
      OpenSSL::SSL::SSLContext::SESSION_CACHE_NO_INTERNAL_STORE
    @ssl_context.session_new_cb = proc {|sock, sess| @ssl_session = sess }
    @ssl_session = nil
    if options[:private_data_connection].nil?
      @private_data_connection = true
    else
      @private_data_connection = options[:private_data_connection]
    end
  else
    @ssl_context = nil
    if options[:private_data_connection]
      raise ArgumentError,
        "private_data_connection can be set to true only when ssl is enabled"
    end
    @private_data_connection = false
  end
  @binary = true
  if options[:passive].nil?
    @passive = @@default_passive
  else
    @passive = options[:passive]
  end
  if options[:debug_mode].nil?
    @debug_mode = false
  else
    @debug_mode = options[:debug_mode]
  end
  @resume = false
  @bare_sock = @sock = NullSocket.new
  @logged_in = false
  @open_timeout = options[:open_timeout]
  @ssl_handshake_timeout = options[:ssl_handshake_timeout]
  @read_timeout = options[:read_timeout] || 60
  if host
    connect(host, options[:port] || FTP_PORT)
    if options[:username]
      login(options[:username], options[:password], options[:account])
    end
  end
end

Создаёт и возвращает новый объект FTP. Если задан host, устанавливается соединение.

options — хеш-опций, ключи которого — символы.

Доступные опции:

port

Номер порта (значение по умолчанию — 21)

ssl

Если options — true, то будет выполнена попытка использовать SSL (теперь TLS) для подключения к серверу. Для этого необходимо установить расширения OpenSSL [OSSL] и Ruby OpenSSL [RSSL]. Если options — хеш, он передаётся в OpenSSL::SSL::SSLContext#set_params в качестве параметров.

private_data_connection

Если true, TLS используется для соединений передачи данных. По умолчанию: true когда options — true.

username

Имя пользователя для входа. Если options — строка “anonymous” и options — nil, в качестве пароля используется “anonymous@”.

password

Пароль для входа.

account

Данные учётной записи для ACCT.

passive

При true, соединение находится в пассивном режиме. По умолчанию: true.

open_timeout

Количество секунд ожидания открытия соединения. Смотрите Net::FTP#open_timeout для деталей. По умолчанию: nil.

read_timeout

Количество секунд ожидания чтения одного блока. Смотрите Net::FTP#read_timeout для деталей. По умолчанию: 60.

ssl_handshake_timeout

Количество секунд ожидания рукопожатия TLS. Смотрите Net::FTP#ssl_handshake_timeout для деталей. По умолчанию: nil.

debug_mode

При true, весь трафик к серверу и от него записывается в +$stdout+. По умолчанию: false.

Вызывает метод суперкласса
open(host, *args) { |ftp| ... } Показать исходный код
# File lib/net/ftp.rb, line 161
def FTP.open(host, *args)
  if block_given?
    ftp = new(host, *args)
    begin
      yield ftp
    ensure
      ftp.close
    end
  else
    new(host, *args)
  end
end

Синоним для FTP.new, но с обязательным параметром host.

Если задан блок, он передаётся объекту FTP. Этот объект будет закрыт при завершении блока или при возникновении исключения.

Публичные методы экземпляра

abort() Show source
# File lib/net/ftp.rb, line 1230
def abort
  line = "ABOR" + CRLF
  print "put: ABOR\n" if @debug_mode
  @sock.send(line, Socket::MSG_OOB)
  resp = getmultiline
  unless ["426", "226", "225"].include?(resp[0, 3])
    raise FTPProtoError, resp
  end
  return resp
end

Прерывает предыдущую команду (команда ABOR).

acct(account) Show source
# File lib/net/ftp.rb, line 883
def acct(account)
  cmd = "ACCT " + account
  voidcmd(cmd)
end

Отправляет команду ACCT.

Это менее распространённая FTP команда, для отправки информации об учётной записи, если это требуется удалённым хостом.

binary=(newmode) Show source
# File lib/net/ftp.rb, line 278
def binary=(newmode)
  if newmode != @binary
    @binary = newmode
    send_type_command if @logged_in
  end
end

Установка для переключения режимов передачи в бинарном режиме. newmode может быть либо true, либо false

chdir(dirname) Show source
# File lib/net/ftp.rb, line 1151
def chdir(dirname)
  if dirname == ".."
    begin
      voidcmd("CDUP")
      return
    rescue FTPPermError => e
      if e.message[0, 3] != "500"
        raise e
      end
    end
  end
  cmd = "CWD #{dirname}"
  voidcmd(cmd)
end

Изменяет (удаленный) каталог.

close() Show source
# File lib/net/ftp.rb, line 1344
def close
  if @sock and not @sock.closed?
    begin
      @sock.shutdown(Socket::SHUT_WR) rescue nil
      orig, self.read_timeout = self.read_timeout, 3
      @sock.read rescue nil
    ensure
      @sock.close
      self.read_timeout = orig
    end
  end
end

Закрывает соединение. Дальнейшие операции невозможны до тех пор, пока вы не откроете новое соединение с помощью connect.

closed?() Show source
# File lib/net/ftp.rb, line 1360
def closed?
  @sock == nil or @sock.closed?
end

Возвращает true, если соединение закрыто.

connect(host, port = FTP_PORT) Show source
# File lib/net/ftp.rb, line 366
def connect(host, port = FTP_PORT)
  if @debug_mode
    print "connect: ", host, ", ", port, "\n"
  end
  synchronize do
    @host = host
    @bare_sock = open_socket(host, port)
    @sock = BufferedSocket.new(@bare_sock, read_timeout: @read_timeout)
    voidresp
    if @ssl_context
      begin
        voidcmd("AUTH TLS")
        ssl_sock = start_tls_session(@bare_sock)
        @sock = BufferedSSLSocket.new(ssl_sock, read_timeout: @read_timeout)
        if @private_data_connection
          voidcmd("PBSZ 0")
          voidcmd("PROT P")
        end
      rescue OpenSSL::SSL::SSLError, OpenTimeout
        @sock.close
        raise
      end
    end
  end
end

Устанавливает FTP соединение с хостом, при необходимости переопределяя порт по умолчанию. Если переменная окружения SOCKS_SERVER установлена, настраивает соединение через прокси SOCKS. Вызывает исключение (обычно Errno::ECONNREFUSED) если соединение не может быть установлено.

delete(filename) Show source
# File lib/net/ftp.rb, line 1137
def delete(filename)
  resp = sendcmd("DELE #{filename}")
  if resp.start_with?("250")
    return
  elsif resp.start_with?("5")
    raise FTPPermError, resp
  else
    raise FTPReplyError, resp
  end
end

Удаляет файл на сервере.

dir(*args)
Псевдоним для: list
features() Show source
# File lib/net/ftp.rb, line 1310
def features
  resp = sendcmd("FEAT")
  if !resp.start_with?("211")
    raise FTPReplyError, resp
  end

  feats = []
  resp.split("\n").each do |line|
    next if !line.start_with?(' ') # skip status lines

    feats << line.strip
  end

  return feats
end

Выполняет команду FEAT

Возвращает массив поддерживаемых дополнительных функций

get(remotefile, localfile = File.basename(remotefile), blocksize = DEFAULT_BLOCKSIZE) { |data| ... } Show source
# File lib/net/ftp.rb, line 812
def get(remotefile, localfile = File.basename(remotefile),
        blocksize = DEFAULT_BLOCKSIZE, &block) # :yield: data
  if @binary
    getbinaryfile(remotefile, localfile, blocksize, &block)
  else
    gettextfile(remotefile, localfile, &block)
  end
end

Извлекает remotefile в том режиме, в котором установлен сеанс (текстовый или бинарный). См. gettextfile и getbinaryfile.

getbinaryfile(remotefile, localfile = File.basename(remotefile), blocksize = DEFAULT_BLOCKSIZE) { |data| ... } Show source
# File lib/net/ftp.rb, line 751
def getbinaryfile(remotefile, localfile = File.basename(remotefile),
                  blocksize = DEFAULT_BLOCKSIZE, &block) # :yield: data
  f = nil
  result = nil
  if localfile
    if @resume
      rest_offset = File.size?(localfile)
      f = File.open(localfile, "a")
    else
      rest_offset = nil
      f = File.open(localfile, "w")
    end
  elsif !block_given?
    result = String.new
  end
  begin
    f&.binmode
    retrbinary("RETR #{remotefile}", blocksize, rest_offset) do |data|
      f&.write(data)
      block&.(data)
      result&.concat(data)
    end
    return result
  ensure
    f&.close
  end
end

Извлекает remotefile в бинарном режиме, сохраняя результат в localfile. Если localfile равен nil, возвращает полученные данные. Если предоставлен блок, ему передаются полученные данные в фрагментах по blocksize.

getdir()
Псевдоним для: pwd
gettextfile(remotefile, localfile = File.basename(remotefile)) { |line| ... } Show source
# File lib/net/ftp.rb, line 786
def gettextfile(remotefile, localfile = File.basename(remotefile),
                &block) # :yield: line
  f = nil
  result = nil
  if localfile
    f = File.open(localfile, "w")
  elsif !block_given?
    result = String.new
  end
  begin
    retrlines("RETR #{remotefile}") do |line, newline|
      l = newline ? line + "\n" : line
      f&.print(l)
      block&.(line, newline)
      result&.concat(l)
    end
    return result
  ensure
    f&.close
  end
end

Извлекает remotefile в режиме ASCII (текстовом), сохраняя результат в localfile. Если localfile равен nil, возвращает полученные данные. Если предоставлен блок, ему передаются полученные данные построчно.

help(arg = nil) Show source
# File lib/net/ftp.rb, line 1273
def help(arg = nil)
  cmd = "HELP"
  if arg
    cmd = cmd + " " + arg
  end
  sendcmd(cmd)
end

Выполняет команду HELP.

list(*args) { |line| ... } Show source
# File lib/net/ftp.rb, line 907
def list(*args, &block) # :yield: line
  cmd = "LIST"
  args.each do |arg|
    cmd = "#{cmd} #{arg}"
  end
  lines = []
  retrlines(cmd) do |line|
    lines << line
  end
  if block
    lines.each(&block)
  end
  return lines
end

Возвращает массив информации о файлах в каталоге (вывод похож на `ls -l`). Если задан блок, он перебирает список.

Также является псевдонимом для: ls, dir
login(user = "anonymous", passwd = nil, acct = nil) Show source
# File lib/net/ftp.rb, line 598
def login(user = "anonymous", passwd = nil, acct = nil)
  if user == "anonymous" and passwd == nil
    passwd = "anonymous@"
  end

  resp = ""
  synchronize do
    resp = sendcmd('USER ' + user)
    if resp.start_with?("3")
      raise FTPReplyError, resp if passwd.nil?
      resp = sendcmd('PASS ' + passwd)
    end
    if resp.start_with?("3")
      raise FTPReplyError, resp if acct.nil?
      resp = sendcmd('ACCT ' + acct)
    end
  end
  if !resp.start_with?("2")
    raise FTPReplyError, resp
  end
  @welcome = resp
  send_type_command
  @logged_in = true
end

Авторизуется на удаленном хосте. Сеанс должен быть предварительно подключен. Если user это строка «anonymous» и password nil, используется «anonymous@» в качестве пароля. Если параметр acct не nil, после успешного входа в систему отправляется команда FTP ACCT. Вызывает исключение при ошибке (обычно Net::FTPPermError).

ls(*args)
Псевдоним для: list
mdtm(filename) Show source
# File lib/net/ftp.rb, line 1263
def mdtm(filename)
  resp = sendcmd("MDTM #{filename}")
  if resp.start_with?("213")
    return get_body(resp)
  end
end

Возвращает необработанное время последнего изменения (удаленного) файла в формате «YYYYMMDDhhmmss» (команда MDTM).

Используйте mtime, если вам нужен разобранный экземпляр Time.

mkdir(dirname) Show source
# File lib/net/ftp.rb, line 1195
def mkdir(dirname)
  resp = sendcmd("MKD #{dirname}")
  return parse257(resp)
end

Создает удаленный каталог.

mlsd(pathname = nil) { |entry| ... } Show source
# File lib/net/ftp.rb, line 1111
def mlsd(pathname = nil, &block) # :yield: entry
  cmd = pathname ? "MLSD #{pathname}" : "MLSD"
  entries = []
  retrlines(cmd) do |line|
    entries << parse_mlsx_entry(line)
  end
  if block
    entries.each(&block)
  end
  return entries
end

Возвращает массив записей каталога, указанного pathname. Каждая запись содержит информацию (например, размер, время последнего изменения и т. д.) и имя пути. Если задан блок, он перебирает список. Если pathname опущен, предполагается текущий каталог.

mlst(pathname = nil) Show source
# File lib/net/ftp.rb, line 1089
def mlst(pathname = nil)
  cmd = pathname ? "MLST #{pathname}" : "MLST"
  resp = sendcmd(cmd)
  if !resp.start_with?("250")
    raise FTPReplyError, resp
  end
  line = resp.lines[1]
  unless line
    raise FTPProtoError, resp
  end
  entry = line.sub(/\A(250-| *)/, "")
  return parse_mlsx_entry(entry)
end

Возвращает данные (например, размер, время последнего изменения, тип записи и т. д.) о файле или каталоге, указанном pathname. Если pathname опущен, предполагается текущий каталог.

mtime(filename, local = false) Show source
# File lib/net/ftp.rb, line 1188
def mtime(filename, local = false)
  return TIME_PARSER.(mdtm(filename), local)
end

Возвращает время последнего изменения (удаленного) файла. Если local true, оно возвращается как локальное время, в противном случае это время UTC.

nlst(dir = nil) Show source
# File lib/net/ftp.rb, line 891
def nlst(dir = nil)
  cmd = "NLST"
  if dir
    cmd = "#{cmd} #{dir}"
  end
  files = []
  retrlines(cmd) do |line|
    files.push(line)
  end
  return files
end

Возвращает массив имен файлов в удаленном каталоге.

noop() Show source
# File lib/net/ftp.rb, line 1293
def noop
  voidcmd("NOOP")
end

Отправляет команду NOOP.

Ничего не делает, кроме возврата ответа.

option(name, params = nil) Show source
# File lib/net/ftp.rb, line 1333
def option(name, params = nil)
  cmd = "OPTS #{name}"
  cmd += " #{params}" if params

  voidcmd(cmd)
end

Отправляет команду OPTS

  • name Должно быть именем опции для установки

  • params - любые дополнительные параметры для передачи с опцией

пример: option('UTF8', 'ON') => 'OPTS UTF8 ON'

put(localfile, remotefile = File.basename(localfile), blocksize = DEFAULT_BLOCKSIZE, &block) Show source
# File lib/net/ftp.rb, line 868
def put(localfile, remotefile = File.basename(localfile),
        blocksize = DEFAULT_BLOCKSIZE, &block)
  if @binary
    putbinaryfile(localfile, remotefile, blocksize, &block)
  else
    puttextfile(localfile, remotefile, &block)
  end
end

Переносит localfile на сервер в том режиме, в котором установлен сеанс (текстовый или бинарный). См. puttextfile и putbinaryfile.

putbinaryfile(localfile, remotefile = File.basename(localfile), blocksize = DEFAULT_BLOCKSIZE) { |data| ... } Show source
# File lib/net/ftp.rb, line 826
def putbinaryfile(localfile, remotefile = File.basename(localfile),
                  blocksize = DEFAULT_BLOCKSIZE, &block) # :yield: data
  if @resume
    begin
      rest_offset = size(remotefile)
    rescue Net::FTPPermError
      rest_offset = nil
    end
  else
    rest_offset = nil
  end
  f = File.open(localfile)
  begin
    f.binmode
    if rest_offset
      storbinary("APPE #{remotefile}", f, blocksize, rest_offset, &block)
    else
      storbinary("STOR #{remotefile}", f, blocksize, rest_offset, &block)
    end
  ensure
    f.close
  end
end

Переносит localfile на сервер в бинарном режиме, сохраняя результат в remotefile. Если предоставлен блок, вызывает его, передавая переданные данные в blocksize блоках.

puttextfile(localfile, remotefile = File.basename(localfile)) { |line| ... } Show source
# File lib/net/ftp.rb, line 855
def puttextfile(localfile, remotefile = File.basename(localfile), &block) # :yield: line
  f = File.open(localfile)
  begin
    storlines("STOR #{remotefile}", f, &block)
  ensure
    f.close
  end
end

Переносит localfile на сервер в ASCII (текстовом) режиме, сохраняя результат в remotefile. Если предоставлен обратный вызов или связанный блок, вызывает его, передавая переданные данные построчно.

pwd() Show source
# File lib/net/ftp.rb, line 1210
def pwd
  resp = sendcmd("PWD")
  return parse257(resp)
end

Возвращает текущий удаленный каталог.

Также известен как: getdir
quit() Show source
# File lib/net/ftp.rb, line 1284
def quit
  voidcmd("QUIT")
end

Завершает сеанс FTP.

read_timeout=(sec) Show source
# File lib/net/ftp.rb, line 128
def read_timeout=(sec)
  @sock.read_timeout = sec
  @read_timeout = sec
end

Установщик для атрибута read_timeout.

rename(fromname, toname) Show source
# File lib/net/ftp.rb, line 1126
def rename(fromname, toname)
  resp = sendcmd("RNFR #{fromname}")
  if !resp.start_with?("3")
    raise FTPReplyError, resp
  end
  voidcmd("RNTO #{toname}")
end

Переименовывает файл на сервере.

retrbinary(cmd, blocksize, rest_offset = nil) { |data| ... } Show source
# File lib/net/ftp.rb, line 629
def retrbinary(cmd, blocksize, rest_offset = nil) # :yield: data
  synchronize do
    with_binary(true) do
      begin
        conn = transfercmd(cmd, rest_offset)
        while data = conn.read(blocksize)
          yield(data)
        end
        conn.shutdown(Socket::SHUT_WR) rescue nil
        conn.read_timeout = 1
        conn.read rescue nil
      ensure
        conn.close if conn
      end
      voidresp
    end
  end
end

Переводит соединение в бинарный (графический) режим, выполняет заданную команду и извлекает возвращенные данные, передавая их в связанный блок по blocksize символов. Обратите внимание, что cmd - это команда сервера (например, «RETR myfile»).

retrlines(cmd) { |line| ... } Show source
# File lib/net/ftp.rb, line 654
def retrlines(cmd) # :yield: line
  synchronize do
    with_binary(false) do
      begin
        conn = transfercmd(cmd)
        while line = conn.gets
          yield(line.sub(/\r?\n\z/, ""), !line.match(/\n\z/).nil?)
        end
        conn.shutdown(Socket::SHUT_WR) rescue nil
        conn.read_timeout = 1
        conn.read rescue nil
      ensure
        conn.close if conn
      end
      voidresp
    end
  end
end

Переводит соединение в ASCII (текстовый) режим, выполняет заданную команду и передает результирующие данные построчно в связанный блок. Если блок не задан, выводит строки. Обратите внимание, что cmd - это команда сервера (например, «RETR myfile»).

rmdir(dirname) Show source
# File lib/net/ftp.rb, line 1203
def rmdir(dirname)
  voidcmd("RMD #{dirname}")
end

Удаляет удаленный каталог.

sendcmd(cmd) Show source
# File lib/net/ftp.rb, line 491
def sendcmd(cmd)
  synchronize do
    putline(cmd)
    return getresp
  end
end

Отправляет команду и возвращает ответ.

set_socket(sock, get_greeting = true) Show source
# File lib/net/ftp.rb, line 396
def set_socket(sock, get_greeting = true)
  synchronize do
    @sock = sock
    if get_greeting
      voidresp
    end
  end
end

Set сокет, используемый для подключения к серверу FTP.

Может вызвать FTPReplyError, если get_greeting равно false.

site(arg) Show source
# File lib/net/ftp.rb, line 1300
def site(arg)
  cmd = "SITE " + arg
  voidcmd(cmd)
end

Отправляет команду SITE.

size(filename) Show source
# File lib/net/ftp.rb, line 1174
def size(filename)
  with_binary(true) do
    resp = sendcmd("SIZE #{filename}")
    if !resp.start_with?("213")
      raise FTPReplyError, resp
    end
    return get_body(resp).to_i
  end
end

Возвращает размер заданного (удаленного) имени файла.

status(pathname = nil) Show source
# File lib/net/ftp.rb, line 1247
def status(pathname = nil)
  line = pathname ? "STAT #{pathname}" : "STAT"
  if /[\r\n]/ =~ line
    raise ArgumentError, "A line must not contain CR or LF"
  end
  print "put: #{line}\n" if @debug_mode
  @sock.send(line + CRLF, Socket::MSG_OOB)
  return getresp
end

Возвращает статус (команда STAT).

pathname

когда stat вызывается с pathname в качестве параметра, он работает как list, но намного быстрее и через тот же tcp-сеанс.

storbinary(cmd, file, blocksize, rest_offset = nil) { |data| ... } Show source
# File lib/net/ftp.rb, line 679
def storbinary(cmd, file, blocksize, rest_offset = nil) # :yield: data
  if rest_offset
    file.seek(rest_offset, IO::SEEK_SET)
  end
  synchronize do
    with_binary(true) do
      begin
        conn = transfercmd(cmd)
        while buf = file.read(blocksize)
          conn.write(buf)
          yield(buf) if block_given?
        end
        conn.shutdown(Socket::SHUT_WR) rescue nil
        conn.read_timeout = 1
        conn.read rescue nil
      ensure
        conn.close if conn
      end
      voidresp
    end
  end
rescue Errno::EPIPE
  # EPIPE, in this case, means that the data connection was unexpectedly
  # terminated.  Rather than just raising EPIPE to the caller, check the
  # response on the control connection.  If getresp doesn't raise a more
  # appropriate exception, re-raise the original exception.
  getresp
  raise
end

Переводит соединение в бинарный (графический) режим, выполняет заданную команду на стороне сервера (например, «STOR myfile») и отправляет содержимое файла с именем file на сервер. Если предоставлен необязательный блок, он также передает ему данные по blocksize символов.

storlines(cmd, file) { |line| ... } Show source
# File lib/net/ftp.rb, line 715
def storlines(cmd, file) # :yield: line
  synchronize do
    with_binary(false) do
      begin
        conn = transfercmd(cmd)
        while buf = file.gets
          if buf[-2, 2] != CRLF
            buf = buf.chomp + CRLF
          end
          conn.write(buf)
          yield(buf) if block_given?
        end
        conn.shutdown(Socket::SHUT_WR) rescue nil
        conn.read_timeout = 1
        conn.read rescue nil
      ensure
        conn.close if conn
      end
      voidresp
    end
  end
rescue Errno::EPIPE
  # EPIPE, in this case, means that the data connection was unexpectedly
  # terminated.  Rather than just raising EPIPE to the caller, check the
  # response on the control connection.  If getresp doesn't raise a more
  # appropriate exception, re-raise the original exception.
  getresp
  raise
end

Переводит соединение в ASCII (текстовый) режим, выполняет заданную команду на стороне сервера (например, «STOR myfile») и отправляет содержимое файла с именем file на сервер построчно. Если предоставлен необязательный блок, он также передает ему строки.

system() Show source
# File lib/net/ftp.rb, line 1219
def system
  resp = sendcmd("SYST")
  if !resp.start_with?("215")
    raise FTPReplyError, resp
  end
  return get_body(resp)
end

Возвращает информацию о системе.

voidcmd(cmd) Show source
# File lib/net/ftp.rb, line 501
def voidcmd(cmd)
  synchronize do
    putline(cmd)
    voidresp
  end
end

Отправляет команду и ожидает ответ, начинающийся с '2'.

Приватные методы экземпляра

parse_mlsx_entry(entry) Показать исходный код
# File lib/net/ftp.rb, line 1069
def parse_mlsx_entry(entry)
  facts, pathname = entry.chomp.split(/ /, 2)
  unless pathname
    raise FTPProtoError, entry
  end
  return MLSxEntry.new(
    facts.scan(/(.*?)=(.*?);/).each_with_object({}) {
      |(factname, value), h|
      name = factname.downcase
      h[name] = FACT_PARSERS[name].(value)
    },
    pathname)
end
parse_pasv_ipv4_host(s) Показать исходный код
# File lib/net/ftp.rb, line 1398
def parse_pasv_ipv4_host(s)
  return s.tr(",", ".")
end
parse_pasv_ipv6_host(s) Показать исходный код
# File lib/net/ftp.rb, line 1403
def parse_pasv_ipv6_host(s)
  return s.split(/,/).map { |i|
    "%02x" % i.to_i
  }.each_slice(2).map(&:join).join(":")
end
parse_pasv_port(s) Показать исходный код
# File lib/net/ftp.rb, line 1410
def parse_pasv_port(s)
  return s.split(/,/).map(&:to_i).inject { |x, y|
    (x << 8) + y
  }
end
start_tls_session(sock) Показать исходный код
# File lib/net/ftp.rb, line 343
def start_tls_session(sock)
  ssl_sock = SSLSocket.new(sock, @ssl_context)
  ssl_sock.sync_close = true
  ssl_sock.hostname = @host if ssl_sock.respond_to? :hostname=
  if @ssl_session &&
      Process.clock_gettime(Process::CLOCK_REALTIME) < @ssl_session.time.to_f + @ssl_session.timeout
    # ProFTPD returns 425 for data connections if session is not reused.
    ssl_sock.session = @ssl_session
  end
  ssl_socket_connect(ssl_sock, @ssl_handshake_timeout || @open_timeout)
  if @ssl_context.verify_mode != VERIFY_NONE
    ssl_sock.post_connection_check(@host)
  end
  return ssl_sock
end

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API