Skip to content


Детальное логирование в Samba

Иногда ну очень нужно узнать кто же создал или удалил определенный файл с файлового сервера. Стандартный лог-файл, который Samba пишет при настройках по-умолчанию, не позволяет это сделать, так как в него пишутся только события подключения и отключения от общих ресурсов. Пример стандартного лог-файла:

[2010/03/05 20:45:00, 1] smbd/service.c:make_connection_snum(1042)
host44 (10.44.44.44) connect to service PUB initially as user vasya (uid=503, gid=501) (pid 2707)
[2010/03/05 20:47:34, 1] smbd/service.c:close_cnum(1239)
host44 (10.44.44.44) closed connection to service PUB

Чтобы лог-файл был более подробным, в smb.conf нужно добавить следующие строки:

log level = 0 vfs:2
max log size = 0
syslog = 0

[PUBLIC]
  comment = writeable folder
  path = /var/spool/samba/public
  valid users = @admins
  public = yes
  writable = yes
  printable = no
  vfs objects = full_audit
  full_audit:prefix = %u|%I
  full_audit:failure = none
  full_audit:success = mkdir rmdir open read pread write pwrite sendfile rename unlink lock
  full_audit:facility = local5
  full_audit:priority = debug

В параметрах шары все, что касается логирования, перечислено в строках 12-17. В 13-ой строке указываем префикс (логин и IP-адрес клиента). В 15-ой строке перечисляем операции, которые должны подвергаться аудиту (которые будут записываться в лог-файл). В 16-ой и 17-ой строках указываем параметры для syslog. Затем в /etc/syslog.conf добавляем строку

local5.debug  -/var/log/samba/audit.log

и посылаем syslog-у сигнал HUP чтобы тот перечитал свой конфиг. Знак минуса перед именем файла означает, что после каждой записи в файл не будет выполняться операция sync, а данные некоторое время будут находится в оперативной памяти в дисковом буфере. При большой интенсивности потока записей это уменьшает нагрузку на дисковую систему.

В результате в файле /var/log/samba/audit.log появляются примерно такие записи:

Mar 5 21:04:01 serv smbd_audit: vasya|10.44.44.44|pwrite|ok|dir1/somefile.exe
Mar 5 21:04:01 serv smbd_audit: ann|10.44.44.92|open|ok|r|dir2/database.txt
Mar 5 21:04:01 serv smbd_audit: editor|10.44.44.34|pread|ok|dir1/somefile.exe

Posted in *nix, Howto.

Tagged with .


Раздаем права в samba по IP-адресу

Представим ситуацию: есть samba-пользователь vasya, который ходит на samba-сервер с компьютеров с IP-адресами 172.16.0.7 и 172.16.0.13, и нужно сделать так, чтобы при подключении с 172.16.0.7 у него был доступ на запись в общий ресурс NashaShara, а при подключении с 172.16.0.13 – доступ только на чтение. Решается эта задача с помощью макро-подстановок (man 5 smb.conf, раздел "VARIABLE SUBSTITUTIONS") следующим образом:

  1. Создаем директорию /etc/samba/per-ip-configs
  2. В директории /etc/samba/per-ip-configs создаем файл с именем 172.16.0.7.conf:
    [NashaShara]
        comment = Read-Write access
        path = /var/spool/samba/nashashara
        valid users = vasya
        write list = vasya
        create mask = 644
        directory mask = 755
        printable = no
  3. Потом в той же директории /etc/samba/per-ip-configs создаем файл уже с именем 172.16.0.13.conf:
    [NashaShara]
        comment = Read-only access
        path = /var/spool/samba/nashashara
        valid users = vasya
        create mask = 644
        directory mask = 755
        printable = no
  4. В конфигурационном файле smb.conf в самом начале раздела, где описываются общие ресурсы, добавляем строку:
    include = /etc/samba/per-ip-configs/%I.conf

Таким образом, теперь при подключении нового клиента samba будет подгружать ту часть конфига, которая соответствует IP-адресу клиента (он подставляется вместо %I). Если клиент подключится с другого IP-адреса (для которого нет соответствующего файла в /etc/samba/per-ip-configs) и в основном конфиге smb.conf не будет определения для общего ресурса NashaShara, то клиент просто этот ресурс не увидит и доступа к нему не получит.

Posted in *nix, Howto.

Tagged with , .


Гневное письмо в банк

Заявление

Управляющему Тамбовским филиалом
ОАО АКБ «********-Банк»
********** *. *.
От Потерпевшего ********** ********* *********
г. Тамбов, ул. ************, д. **,кв.**

Уважаемая Ольга Юрьевна!

Вчера 30.08.2006 закончив тяжелый рабочий день, я направился к банкомату, что по улице Октябрьской, д 1. По дороге я напевал «деньги-деньги дребеденьги» и отчетливо представлял, как конвертирую презренные бумажки, на вечер с прекрасной знакомкой в каком-нибудь близлежащем кафе. Ничего не подозревая, я подошел к банкомату, вставил карту, набрал пин-код и решив что 1500 (одна тысяча пятьсот) рублей вполне подходящая сумма (и голодным не останешься и жаба потом душить не будет) я нажал «Ввод». Ну а поскольку в нашем офисе введен режим жесткой экономии бумаги, то на предложение автомата распечатать чек, я ответил решительным отказом. Ведь как-никак мы с Вами один холдинг, а стало быть делаем общее дело и должны помогать экономить друг другу, пусть даже на банковских чеках.

В момент ожидания денег я задумался и ярко представил себе холодную кружку пенной «Крушовицы». горячие баварские колбаски с горчицей, которые только пару минут как сняли со скворчащей сковородки, атмосферу тепла и уюта, веселых друзей и симпатичных подруг. Каких-то 20 минут отделяли меня от праздника жизни, где нет места начальникам и подчиненным, закулисным интригам и подковерной борьбе....И в этот момент я посмотрел на отверстие в банкомате, откуда обычно подаются купюры. Там уже лежали и ждали пока я ими овладею, мои кровные 1500 руб. Но только было я протянул руку за ними, как что-то проскрипело, зажужжало и как по мгновению волшебной палочки, деньги втянулись в банкомат обратно. Мир рухнул - вот первое что я подумал на тот момент. Но вслух лишь произнес слово, отражающее краткую характеристику пользующейся дурной славой девушки, которое я здесь не могу привести по причине своего хорошего воспитания.

Надеясь на лучшее, я проверил баланс, но оказалось, что деньги уже списались с моего счета. И тут. казавшийся таким приятным вечер мгновенно изменился. Исчезли и перспективы встречи с любительницами «Крушовицы» и баварские колбаски, тепло и уют в придачу. Я стоял у бездушного банкомата и задавался вопросами:
1. Почему все гак не правильно на этом свете и где вселенская справедливость?
2. Почему всего можно добиться только обманом и ложью?
3. Почему хорошие люди живут мало, а плохие долго?
4. Почему люди координируют свои действия, руководствуясь только личной выгодой?
5. Как можно без денег насладиться пивом, колбасками и обществом прекрасной знакомки?

Покурив и поразмыслив над суетностью бытия, я решил, что если хорошенько подумать, то в принципе, ну так, чисто теоретически, я могу выделить еще одну сумму эквивалентную 1500 руб. на проведение сегодняшнего вечера. И уже без особого энтузиазма, я снова поплелся к банкомату. Опять же по привычке вставив карту и набрав пин-код, я стал ждать вожделенной компенсации из цветных бумажек. Но на этот раз вылез только чек, хотя я его не просил и карта. На чеке была надпись, обозначающая полное фиаско, а также то, что засну я сегодня голодным, трезвым и в одиночестве, а именно: «Извините, в банкомате кончились купюры» (этот чек я сохранил, на случай если у Вас также введена экономия бумаги и Вам приходится распечатывать новые чеки на обратной стороне старых. И могу его вам передать по случаю).

Нет я не стал портить имущество ОАО АКБ «*****-Банк» и знакомить окружающих с новыми лексико-семантическими конструкциями. Я вдруг четко осознал, что мы с вами часть одной команды, вместе настроенные на достижение результата. И только совместные усилия приведут нас к победе в обозримом будущем. Не могу не поделиться своей рационализаторской находкой. На данный момент, как я понял, время ожидания банкомата составляет 30 секунд. После этого времени он «втягивает» деньги назад. Настоящим предлагаю сократить время ожидания банкомата до 5 секунд, а из «втянутых» обратно в банкомат денег сформировать премиальный фонд работников ОАО АКБ «*****-Банк». Акцию можно провести под лозунгом: «Тренируя реакцию. Вы повышаете рождаемость». Как автор идеи я претендую на 15% от суммы и по возможности на место в совете директоров.

P.S. Прошу зачислить насильственно отнятую у меня банкоматом сумму в размере 1500 руб. на счет моей пластиковой карты.

Posted in Fun.


Штучки с sed-ом

sed – это stream editor. Часто используется в скриптах для различных преобразований текста. Очень мощный инструмент, если понять как он работает. Ниже приведено несколько типичных примеров.

  1. Удаление из файла заданных строк.
    Пусть, например, нужно удалить строки из файла, в которых содержится подстрока "phone: xxx-xx-xx" (вместо символа x - цифры):

    sed "/phone: [0-9]\{3\}-[0-9]\{2\}-[0-9]\{2\}/ d" test.txt

    Здесь между слешами (/) задается шаблон (регулярное выражение), после него стоит оператор "d" (от слова delete), который удаляет строки файла test.txt, совпадающие с шаблоном. Результат:

    $ cat test.txt
    phone: 111-22-44
    phone: 111-22-45
    phone: 311-22-d4
    phone: 111-22-55
     
    $ sed "/phone: [0-9]\{3\}-[0-9]\{2\}-[0-9]\{2\}/ d" test.txt
    phone: 311-22-d4

    Для противоположного эффекта (если хотим удалить из файла строки, НЕ попадаюащие под шаблон) нужно добавить восклицательный знак после закрывающего регулярное выражение слеша:

    $ sed "/phone: [0-9]\{3\}-[0-9]\{2\}-[0-9]\{2\}/! d" test.txt
    phone: 111-22-44
    phone: 111-22-45
    phone: 111-22-55

    Если нужно, чтобы изменения происходили сразу в файле, без вывода в stdout, нужно добавить ключ --in-place (-i).

  2. Добавление в файл строки в определённом месте.
    Вставляем мета-тег с указанием кодировки документа перед закрывающим тегом </head> во все файлы с расширением .html в текущей директории:

    sed -i '/<\/head>/ i <meta http-equiv="Content-Type" content="text\/html; charset=utf-8">' *.html
    sed -i -r "s/\r//g" *.html

    Второй sed нужен чтобы поудалять символ возврата каретки с ASCII-кодом 13 в конце строк, который почему-то появляется в результате работы первого sed-а.

  3. Удаление из файла первых нескольких строк до тех пор, пока не встретиться пустая строка. Такое часто бывает нужно при обработке писем – если нужно отделить заголовок письма от его тела:
    $cat test.txt
    Some text in mail header.
    Another text line in mail header.
    And so on...
     
    Here starts mail body.
    Some text in mail body.
    Use sed to make things nice :)
     
    $sed '1,/^$/ d' test.txt
    Here starts mail body.
    Some text in mail body.
    Use sed to make things nice :)

    Здесь видно, что первые три строки были удалены. Шаблон /^$/ означает пустую строку (символ ^ совпадает с началом строки, а символ $ – с концом строки. Так как между ними ничего нет, то строка пустая). Выражение 1,/^$/ означает диапазон строк с 1-ой до пустой включительно. Оператор "d" – удаление.

  4. Получение заголовка usenet/email письма (удаление всего после 1-ой пустой строки):
    sed '/^$/q' /tmp/mail_message
  5. Вставить пустую строку перед строкой, совпадающей с регулярным выражением “regex”:
    sed '/regex/{x;p;x;}' test.txt
  6. Вставить пустую строку после строки, совпадающей с регулярным выражением “regex”:
    sed '/regex/G' test.txt
  7. Удаление комментариев и пустых строк. Допустим, мы хотим в каком-то конфиге посмотреть только самую его суть, не отвлекаясь на комментарии и объяснения что означают используемые опции. Для этого используем такую простую команду:
    $egrep -v "^#" /etc/snmp/snmpd.conf | sed '/^$/ d'

    В результате grep уберет из файла /etc/snmp/snmpd.conf строки, в начале которых стоит символ решётки (но оставит пустые строки), а следующий за ним sed найдёт и удалит строки, у которых между началом и концом строки ничего нет.

  8. Замена текста. Для этого используется оператор s///:
    $cat test.txt
    I want to have nice house with 4 rooms.
     
    $sed "s/\(nice\)/very \1/" test.txt | sed "s/[0-9]/12/"
    I want to have very nice house with 12 rooms.

    В операторе замены s (чаще всего используется его вариант s///) между 1-ым и 2-ым слешем указывается шаблон, который нужно найти для замены, а между 2-ым и 3-им слешем – текст, НА который нужно заменить шаблон. Если в шаблоне используются круглые скобки (их нужно экранировать обратными слешами), то текст между скобками будет доступен для использования во второй части оператора (это называется backreference). Для вставки текста, заключенного в 1-ую пару скобок, применяется конструкция \1, для текста между второй парой скобок – \2 и т.д. Символ амперсанда (&) в правой части используется для вставки текста, который совпал с регулярным выражением в левой части. Вместо слеша в операторе s можно использовать любой другой символ, например:

    $ echo "I want to have a nice house with 4 rooms." | sed "s|nice|very &|"
    I want to have a very nice house with 4 rooms.

    Если нужно заменить все вхождения шаблона в строке, а не только первое, то нужно использовать флаг g (от слова global):

    $ echo "AAABBBCCC" | sed "s/A/X/"
    XAABBBCCC
    $ echo "AAABBBCCC" | sed "s/A/X/g"
    XXXBBBCCC

    Если нужно заменить не первое вхождение шаблона в тексте, а какое-то N-ое, то нужно использовать флаг N (который также можно комбинировать с флагом g --- в этом случае заменится N-ое И все последующие совпадения шаблона в тексте):

    $ echo "AAAA-BBBB-CCCC" | sed "s/A/X/2"
    AXAA-BBBB-CCCC
    $ echo "AAAA-BBBB-CCCC" | sed "s/A/X/3"
    AAXA-BBBB-CCCC
    $ echo "AAAA-BBBB-CCCC" | sed "s/A/X/2g"
    AXXX-BBBB-CCCC
  9. Удаление HTML-тегов
    sed -e :a -e 's/<[^>]*>//g;/</N;//ba' index.html

    Фрагмент ;/</N;//ba предназначен для удаления тегов, растянутых на несколько строк. Без него будут удаляться только те теги, которые были закрыты угловой скобкой в той же стройке, в которой были открыты.

  10. Удаление символов перевода строки (объединение всех строк файла в одну)
    cat /tmp/file.txt ; echo ; sed ':a; /$/N; s/\n//; ta' /tmp/file.txt
    Это строка N1
    А это строка номер 2
    This is line number 3
     
    Это строка N1А это строка номер 2This is line number 3
  11. Преобразование регистра. Конвертация из строчных в прописные:
    $ echo "UPPer And lowER CASE mixed" | sed 's/.*/\U&/'
    UPPER AND LOWER CASE MIXED

    Конвертация из прописных в строчные:

    echo "UPPer And lowER CASE mixed" | sed 's/.*/\L&/'
    upper and lower case mixed
  12. Удаление последней (лишней) запятой из JSON-файла:
    $ cat somefile.json | sed -zr 's/,([^,]*$)/\1/'

Posted in *nix, Howto.

Tagged with .