Archive for June 29th, 2009
Записать файл в шару с помощью perl
Возникла у меня задача: необходимо из perl скрипта, который работает на linux машине создать файл в windows шаре. Нет никаких проблема заранее примонтировать шару к файловой системе, а потом уже просто записывать файл.
В моем случае, мне необходимо писать в большое количество разных сетевых папок, заранее не зная в какую. В этом случае я счел нецелесообразным монтировать все эти шары и стал искать средство попроще.
Я практически сразу получил ответ на свой вопрос в списке рассылке moscow.pm — нужно использовать Filesys::SmbClient (Андрей Костенко, большое спасибо).
Мне далеко не сразу удалось справится с инсталляцией этого пакета, но в конце-концов все получилось. Чтобы не забыть, как я это делал, я отписываю этот пост.
Итак, есть сервер с debian 5.0. Нужно поставить на него perl модуль Filesys::SmbClient.
В самом начале проверяем, что есть все необходимое для сборки модуля:
sudo apt-get install libc6-dev g++ gcc
Для установки модуля необходимо поставить некоторые библиотеки:
sudo apt-get install libsmbclient-dev
Дальше, в теории, нужно вот так ставить модуль:
sudo cpan -i Filesys::SmbClient
Но у меня так не получилось =( Поставил вручную.
Для начала скачиваю:
wget http://search.cpan.org/CPAN/authors/id/A/AL/ALIAN/Filesys-SmbClient-3.1.tar.gz
Разархивирую:
tar xvfz Filesys-SmbClient-3.1.tar.gz
Дальше:
perl Makefile.PL
На вопрос “где можно найти libsmbclient.h” отвечаю дефолтным ответом: /usr/include
На вопрос “где можно найти libsmbclient.so” так же отвечаю дефолтным ответом: /usr/lib
Тесты пройти у меня не получилось, но сам модуль работает, поэтому на вопрос Do you want make tests? нужно ответить no. Вопрос “Compile module with trace to STDERR ?” оставляем по дефолту в no.
Дальше делаем make, после этого делаем sudo make install (Вообще, обычно между make и sudo make install делается еще и make test, но у меня тесты этого модуля совсем не проходились).
Итак, после выполнения этих действий можно работать.
Вот скрипт, который позволяет сохранить файл в шару, в том случае если доступ к шаре осуществляется без необходимости указывать имя/пароль:
#! /usr/bin/perl
use POSIX;
use Filesys::SmbClient;
my $smb = new Filesys::SmbClient( debug => 0 );
# Write a file
my $fd = $smb->open(”>smb://192.168.1.1/share/test.txt”, 0666)
or die “Can’t create file:”, $!, “\n”;
$smb->write($fd, “A test of write call\n”)
or die $!,”\n”;
$smb->close($fd);
В том случае, если нужно вводить имя пользователя, то говорим вот так:
my $smb = new Filesys::SmbClient( username => "user", password =>"password", debug => 0 );