Клиентские операции FTP

Проблема

Вы хотите подключиться к серверу FTP, чтобы отправить или принять с него файлы. Например, вы решили автоматизировать разовую пересылку многих файлов или автоматически создать зеркальную копию целого раздела сервера FTP.

Решение

Воспользуйтесь модулем Net::FTP с CPAN.
use Net::FTP;
$ftp = Net::FTP->new("ftp.host.com") or die "Couldn't login\n";
$ftp->login($username, $password) or die "Couldn't change directory\n";
$ftp->cwd($directory) or die "Couldn't get $directory\n";
$ftp->get($filename) or die "Couldn't put $filename\n";
$ftp->put($filename) or die "Can't connect: $@\n";

Комментарий

Работа с модулем Net::FTP состоит из трех шагов: подключение к серверу, идентификация и аутентификация и пересылка файлов. Все операции с сервером FTP реализуются методами объекта Net::FTP. При возникновении ошибки методы возвращают undef в скалярном контексте и пустой список в списковом контексте.
Подключение осуществляется конструктором new. В случае ошибки переменной $@ присваивается сообщение об ошибке, a new возвращает undef. Первый аргумент определяет имя хоста сервера FTP и может сопровождаться необязательными параметрами:
$ftp = Net::FTP->new("ftp.host.com",
                     Timeout => 30,
                     Debug   => 1)
  or die "Can't connect: $@\n";
Параметр Timeout определяет промежуток времени в секундах, после которого любая операция считается неудачной. Параметр Debug устанавливает уровень отладки (при значении, отличном от нуля, копии всех команд отправляются в STDERR). Строковый параметр Firewall определяет компьютер, являющийся прокси-сервером FTP. Параметр Port задает альтернативный номер порта (по умолчанию используется значение 21, стандартный номер порта FTP). Наконец, если параметр Passive равен true, все пересылки выполняются в пассивном режиме (требования некоторых брандмауэров и прокси-серверов). Параметры Firewall и Passive переопределяют переменные окружения FTP_FIREWALL и FTP_PASSIVE.
Следующим после подключения шагом является аутентификация. Обычно функция login вызывается с тремя аргументами: именем пользователя, паролем и учетной записью (account).
$ftp->login()
  or die "Couldn't authenticate.\n";
$ftp->login($username)
  or die "Still couldn't authenticate.\n":
$ftp->login($username, $password)
  or die "Couldn't authenticate, even with explicit username and password.\n";
$ftp->login($username, $password, $account)
  or die "No dice. It hates me.\n";
Если вызвать login без аргументов, Net::FTP с помощью модуля Net::Netrc определяет параметры хоста, к которому вы подключились. Если данные не найдены, делается попытка анонимной регистрации (пользователь anonymous, пароль username@hostname). Если при имени пользователя anonymous пароль не задан, в качестве пароля передается почтовый адрес пользователя. Дополнительный аргумент (учетная запись) в большинстве систем не используется. При неудачной аутентификации функция login возвращает undef.
После завершения аутентификации стандартные команды FTP выполняются с помощью методов, вызываемых для объекта Net::FTP. Методы get и put принимают и отправляют файлы. Отправка файла выполняется так:
$ftp->put($localfile, $remotefile)
  or die "Can't send $localfile:  $!\n";
Если второй аргумент отсутствует, имя удаленного файла совпадает с именем локального файла. Передаваемые данные также можно брать из файлового манипулятора (в этом случае имя удаленного файла передается в качестве второго аргумента):
$ftp->put(*STDIN, $remotefile)
  or die "Can't send from STDIN: !\n";
Если пересылка прерывается, удаленный файл не удаляется автоматически. Метод put возвращает удаленное имя файла при успешном завершении или undef в случае ошибки. Метод get, используемый для приема файлов, возвращает локальное имя файла или undef в случае ошибки:
$ftp->get($remotefile, $localfile)
  or die "Can't fetch $remotefile : $!\n";
Метод get тоже может использоваться для приема файла в манипулятор; он возвращает манипулятор (или undef в случае ошибки):
$ftp->get($remotefile, *STDOUT)
  or die "Can't fetch $remotefile:  $!\n";
Необязательный третий аргумент get, смещение в удаленном файле, инициирует пересылку с заданного смещения. Принятые байты дописываются в конец локального файла.
Метод type изменяет режим трансляции файла. Если передать ему строку ("А", "I", "E" или "L"), возвращается предыдущий режим трансляции. Методы ascii, binary, ebcdic и byte вызывают type с соответствующей строкой. При возникновении ошибок (например, если сервер FTP не поддерживает EBCDIC) type и вспомогательные методы возвращают undef.
Методы cwd($remotedir) и pwd используются для установки и определения текущего удаленного каталога. Оба метода возвращают true в случае успеха и false в противном случае. При вызове cwd("..") вызывается метод cdup для перехода в родительский каталог текущего каталога. Вызов cwd без аргументов выполняет переход в корневой каталог.
$ftp->cwd("/pub/perl/CPAN/images/g-rated");
print "I'm in the directory ", $ftp->pwd(), "\n";
Методы mkdir($remotedir) и rmdir($remotedir) создают и, соответственно, удаляют каталоги на удаленном компьютере. Для создания и удаления каталогов на локальном компьютере применяются встроенные функции mkdir и rmdir. Чтобы создать промежуточные каталоги на пути к указанному, передайте mkdir второй аргумент, равный true. Например, чтобы создать каталоги /pub, /pub/gnat и pub/gnat/perl, воспользуйтесь следующим вызовом:
$ftp->mkdir("/pub/gnat/perl", 1)
  or die "Can't create /pub/gnat/perl recursively: $!\n";
Если функция mkdif вызывается успешно, возвращается полный путь к только что созданному каталогу. При неудаче mkdir возвращает undef.
Методы ls и dir возвращают список содержимого удаленного каталога. Традиционно dir выводит более подробную информацию, чем ls, но в обоих случаях стандартного формата не существует. Большинство серверов FTP выводит результаты команд ls и ls -l, но нельзя гарантировать, что это правило будет соблюдаться всеми серверами. В списковом контексте эти методы возвращают список строк, возвращенных сервером. В скалярном контексте возвращается ссылка на массив.
@lines = $ftp->ls("/pub/gnat/perl")
  or die "Can't get a list of files in /pub/gnat/perl: $!";
$ref_to_lines = $ftp->dir("/pub/perl/CPAN/src/latest.tar.gz")
  or die "Can't check status of latest.tar.gz: $!\n";
Для корректного завершения работы с FTP используется метод quit:
$ftp->quit() or warn "Couldn't quit. Oh well.\n";
Другие методы переименовывают удаленные файлы, меняют владельца и права доступа, проверяют размер удаленных файлов и т. д.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: