linux

Записать файл в шару с помощью 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

Подключение по ssh с x11 forwarding по умолчанию

Я очень часто подключаюсь к разным линукс машинам с помощью вот такой команды:

ssh host -X -C

  • -X — включается проброска x11 трафика
  • -C — осуществляется сжатие трафика

Эту комманду я использую для того, чтобы запускать на удаленной машине всякие графические программы - медленно, но очень удобно (хотя, я, конечно же, предпочитаю консоль и всегда, когда возможно, пытаюсь использовать ее).

Вообщем, мне надоело каждый раз вводить параметры, и я решил один раз разобраться, как сделать так, чтобы это все было по умолчанию. Ответ нашелся в man 5 ssh_config. Всего-то нужно создать файл ~/.ssh/config, следующего содержания:

ForwardX11 yes
Compression yes

UPDATE 24.03.2009 — изначально я писал, что в файл ~/.ssh/config стоит писать так же CompressionLevel 9, но это неправильно. Вот фрагмент man ssh: Compression is desirable on modem lines and other slow connections, but will only slow down things on fast networks. . Действительно, с этой настройкой работает медленее, так что ее лучше не указывать.

Tags: , ,

Sunday, March 22nd, 2009 Uncategorized Comments Off

Как по ubuntu заставить thunderbird проверять обноволение imap почты во всех папках

Если письма сортируются на стороне сервера (что очень удобно), то в thunderbird со стандартными настройками нельзя увидеть, появлились ли письма в каких-то папках, кроме как в inbox. Единственный способ это выяснить — “прощелкать” все папки. Легчится элементарно: в файл user.js пишется:

user_pref("mail.check_all_imap_folders_for_new", true);

Изначально файл user.js не существует (нужно создать). В ubuntu он располагается в папке: /home/user/.mozilla-thunderbird/xxxxxxxx.default/

Tags: , ,

Tuesday, January 20th, 2009 Uncategorized Comments Off

Подключение по ssh без необходимости вводить пароль

Как-то мне понадобилось, чтобы одна linux машина (клиент) могла подключатся к другой (сервер) по протоколу ssh без необходимости ввода пароля. Инфы о том, как это сделать — куча. В данном посте я повторяю то что уже написано множество раз, я это делаю чтобы закрепить знания и иметь под рукой краткую, удобную для меня инструкцию.

Итак, есть клиент (linux машина), который должен подключатся к серверу (linux машина с работающим ssh демоном). При подключении сервер не должен спрашивать у клиента пароль.

На клиенте запускаю комманду, которая сгенерит файл с откртым ключем ~/ssh/id_rsa.pub и с файл с закрытым ключем ~/ssh/id_rsa:
ssh-keygen -t rsa

Копирую открытый ключ с клиент на сервер:
scp ~/.ssh/id_rsa.pub host.local:/home/user/.ssh/authorized_keys2

Все =) Теперь если на клиенте набрать ssh host.local то подключение по ssh пройдет без необходимости вводить пароль.

Tags:

Thursday, January 15th, 2009 Uncategorized Comments Off

tail -f с фильтром

Очень удобно смотреть некоторые логи с помощью tail -f logfile — на экране показывается в real time все попадающее в лог файл. Но когда в файл записывается ну слишком много всего и вывод совершенно невозможно читать.

Хочется иметь возможность фильтровать вывод, но так же получать его на экран в режиме реального времени. Как оказалось — это очень просто:


root@mail:/var/log# tail -f mail.log|grep “connect from”
Dec 23 12:09:35 mail postfix/smtpd[1940]: connect from unknown[A.B.C.D]
Dec 23 12:09:36 mail postfix/smtpd[1938]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:36 mail postfix/smtpd[2522]: connect from host[A.B.C.D]
Dec 23 12:09:36 mail postfix/smtpd[1955]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:37 mail postfix/smtpd[2513]: connect from host[A.B.C.D]
Dec 23 12:09:37 mail postfix/smtpd[2502]: connect from unknown[A.B.C.D]
Dec 23 12:09:37 mail postfix/smtpd[1432]: disconnect from host[A.B.C.D]
Dec 23 12:09:38 mail postfix/smtpd[1367]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:38 mail postfix/smtpd[1977]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:38 mail postfix/smtpd[1940]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:39 mail postfix/smtpd[2455]: disconnect from unknown[A.B.C.D]
Dec 23 12:09:39 mail postfix/smtpd[2471]: disconnect from unknown[A.B.C.D]

Но иногда хочется ставить не один фильтр, а несколько. Но, как выясняется, несколько грепов подряд — не работает. Решение так же существует и оно очень простое — у всех грепов, кроме последнего добавляется параметр — –line-buffered:


root@mail:/var/log# tail -f mail.log|grep –line-buffered “connect from”|grep -v “disconnect”
Dec 23 12:13:04 mail postfix/smtpd[1941]: connect from host[A.B.C.D]
Dec 23 12:13:04 mail postfix/smtpd[2455]: connect from host[A.B.C.D]
Dec 23 12:13:05 mail postfix/smtpd[1955]: connect from unknown[A.B.C.D]
Dec 23 12:13:06 mail postfix/smtpd[1980]: connect from host[A.B.C.D]
Dec 23 12:13:06 mail postfix/smtpd[1940]: connect from unknown[A.B.C.D]
Dec 23 12:13:07 mail postfix/smtpd[1978]: connect from host[A.B.C.D]
Dec 23 12:13:07 mail postfix/smtpd[2502]: connect from unknown[A.B.C.D]
Dec 23 12:13:09 mail postfix/smtpd[2513]: connect from unknown[A.B.C.D]
Dec 23 12:13:11 mail postfix/smtpd[1432]: connect from host[A.B.C.D]

PS найдено на форуме убунту.

Tags:

Wednesday, December 24th, 2008 Uncategorized Comments Off

Как узнать, что за программа слушает порт?

Ответ: с помощью программы lsof.

Например:

$ sudo lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
apache2 17176 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 17945 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 24898 root 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 24947 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 24952 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 25715 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 26421 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 29851 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 30981 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 31104 www-data 5u IPv6 6181425 TCP *:www (LISTEN)
apache2 31962 www-data 5u IPv6 6181425 TCP *:www (LISTEN)


$ sudo lsof -i :21
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
vsftpd 3800 root 3u IPv4 12036 TCP *:ftp (LISTEN)

Tags:

Friday, November 21st, 2008 Uncategorized 4 Comments

Блокировка ip адреса в случае попытки брутфорса

Обнаружил интересную софтину — fail2ban, она сканирует лог файлы, например /var/log/pwdfail или /var/log/apache/error_log и с помощью правил файрвола банит те ip адреса с которых идет слишком много неудачных попыток входа в систему.

PS наткнулся на эту штуку с пожелания по изменения roundcube для дебиана.

Tags: ,

Wednesday, November 19th, 2008 Uncategorized Comments Off

Отслеживаение подключенных пользователей

Возникла задача — оперативно узнать, подключился ли пользователь по ssh к linux машине.

С помощью команды who можно элементарно узать, кто сейчас подключен:

bessarabov@server:~$ who
bessarabov pts/0 2008-08-06 15:35 (1.1.1.1)

Для того, чтобы оперативно узнать, кто подключен, нужно просто запускать часто эту команду и смотреть на ее вывод. Без проблем можно все время руками ее запускать, но соврешенно просто это автоматизировать.

В bash существует возможность писать циклы. Чуть-чуть разобратся и получается вот такая команда (она бесконечно запускает who (останавливается по ctrl+C)):


$ until false; do who; done

О! Почти то, что нужно. Немного причесываю и готово:


$ until false; do date; who; echo “”; sleep 1; done

Tags: ,

Wednesday, August 6th, 2008 Uncategorized 5 Comments

My bash history

Наткнулся на интересный пост.

Следующая консольная команда linux-а отображает список разных программ, которые запускал пользователь, с указанием количества их запуска:

history 1000 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head -n 50

Вот мой вывод этой команды на моей домашней машине (все что меньше 10 я показывать не стал):

123 cd
85 sudo
59 ls
49 vim
31 svn
25 ping
22 clear

Tags: ,

Saturday, July 19th, 2008 Uncategorized Comments Off

Точное время в Debian GNU/Linux

Задача

Есть сервер с Debian GNU/Linux 4.0 4.0r3 (кстати, именно на этом сервере и работает этот блог).

Очень хочется чтобы на этой машине всегда было точное время (это основная задача).

Так же существует 2 второстепенные задачи, которые противоречат друг другу:

  • Настроить как можно быстрее
  • Настроить как можно лучше

В данном посте я рассмотрю быстрое решение. Про правильное решение будет еще один пост.

Быстрое решение

Для синхронизации времени существует совершенно замечательная штукенция — ntp. Ntp одновременно обозначает и протокол (Network Time Protocol), и программу-демона, которая занимается синхронизацией времени.

Проблема заключается в том, что программа ntp монстрообразная и в ней с кондачка не разберешься (описание работы с ntp будет в следующем посте). Хорошая новость в том, что так же существует программа ntpdate, которая совершенно элементарна в использовании.

1

С помощью следующей команды устанавливаем программу ntpdate:


$ sudo apt-get install ntpdate

2

Внимательно читаем ридмишку к программе, которая располагается по адресу /usr/share/doc/ntpdate/README.Debian.

Из ридмишки выносим следующее:

  • ntpdate не лучший вариант для использования
  • процесс синхронизации происходит каждый раз при “поднятии” сетевого интерфейса

3

Синхронизируем время:


bessarabov@server:~$ sudo ntpdate 0.debian.pool.ntp.org
10 Apr 12:33:39 ntpdate[30191]: step time server 193.125.143.172 offset 211.671828 sec

Ntpdate синхронизировала время на сервере (было отставаниело больше, чем на три минуты).

Резюме

Была установлена программа ntpdate и с помощью нее было синхонизировано время. Программа будет синхронизировать время при понятии сетевого интерфеса (т.е. при включении или перезагрузки машины) + ее можно запускать руками в любоее вермя.

Такое решение прекрасно подходит для всех компьютеров, которые включаются хотя бы оди раз в день (за один день время далеко не убежит), т.е. для домашних машин и для ноутов. Для серверов, которые работают 24×7 это решение, является неоптимальным.

Tags: , , ,

Thursday, April 10th, 2008 Uncategorized Comments Off