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 );
Подключение по 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. . Действительно, с этой настройкой работает медленее, так что ее лучше не указывать.
Как по 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/
Подключение по 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 пройдет без необходимости вводить пароль.
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 найдено на форуме убунту.
Как узнать, что за программа слушает порт?
Ответ: с помощью программы 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)
Блокировка ip адреса в случае попытки брутфорса
Обнаружил интересную софтину — fail2ban, она сканирует лог файлы, например /var/log/pwdfail или /var/log/apache/error_log и с помощью правил файрвола банит те ip адреса с которых идет слишком много неудачных попыток входа в систему.
PS наткнулся на эту штуку с пожелания по изменения roundcube для дебиана.
Отслеживаение подключенных пользователей
Возникла задача — оперативно узнать, подключился ли пользователь по 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
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
Точное время в 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 это решение, является неоптимальным.
| M | T | W | T | F | S | S |
|---|---|---|---|---|---|---|
| « Jun | ||||||
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | ||||