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 );

Tags: ,

Monday, June 29th, 2009 Uncategorized Comments Off