From: Дмитрий Грицевич aka MethroGnome <methrognome@tut.by.>
Newsgroups: email
Date: Mon, 15 Jan 2007 14:31:37 +0000 (UTC)
Subject: Samba: Модернизация "сетевого окружения" Windows
Хочу поделиться способом модернизации "сетевого окружения" Windows,
который успешно внедрен и работает в нашей сети. Что это дает:
1) Полностью администрируемое сетевое окружение.
2) Избавляет от лишних рабочих групп и имен компов (некоторые забывают
сменить или специально меняют каждый день) - пользовательские имена
вообще не будут учитываться
3) Ускоряет его работу - не нужно тратить время на поиск имени компа,
служба WINS вообще больше не понадобится.
Метод я придумал сам, но вот по части программирования не очень силен,
возможно некоторые моменты можно сделать лучше и проще, так что не
пинайте :). Предполагается, что админ уже имеет некоторые познания и я
не буду останавливаться на базовых понятиях что такое DNS, зачем нужен
Master-browser, как настроить Samba и т.д. - этой инфы предостаточно.
Итак, что необходимо:
1) Выделенный сервер под Unix-подобной ОС
2) Установленная на нем Samba и настроенная в качестве Master-browser
3) Perl и модуль IO::Socket для него
4) Желательно также, чтобы в сети работала служба DNS и ИП-адреса компов
резолвились в имена.
В моем случае используются 2 рабочие группы, отдельные мастер-броузеры
на каждую. ОС - FreeBSD 4.9 и 6.1, Perl 5.6, Samba 2.2.8
Принцип работы
Samba держит сетевое окружение в текстовом файле. Все компы переодически
опрашиваются бродкастами и этот файл обновляется. Далее мы сделаем
скрипт, который будет сканировать компы на предмет файлового доступа
(139 TCP-порт), составлять список рабочей группы в нужном формате и
заменять оригинальный файл Самбы. Юзеры в сетевом окружении увидят
содержимое нового файла.
Именем компа делается его IP-адрес, а в описании - название (из DNS).
Т.к. WindowsXP отображает все наоборот, то в списке компы будут в виде:
" название (IP-адрес) ". Обращение к компам происходит мгновенно - время
на разрешение имени в IP-адрес не затрачивается.
Файл сетевого окружения называется browse.dat и обычно находится в
каталоге /var/lock. Структура довольно простая:
Строки с кодом c0001000 описывают рабочие группы и указывают на
мастер-броузера этой группы. Остальные строки - компы, сначала имя,
потом код, описание и рабочая группа.
Теперь собственно сам скрипт с подробными комментариями.
scan139.pl
#!/usr/bin/perl
use IO::Socket;
$NetADDR = "172.20.99."; # Задаем подсеть
$port = 139; # Порт - 139
$proto = "tcp"; # протокол TCP
$Timeout = 0.01; # таймаут сессии (в сетях с потерями можно увеличить до 0.02-0.1с)
### подпрограмма вывода строки в формате файла browse.dat ###
sub add_to_list {
$HostNAME = substr(`nslookup $HostADDR | grep Name `,9); # резолвим имя компа из IP-адреса
$HostNAME =~ s/.vesnianka.netn//; # отбрасываем доменную часть
print '"';
print $HostADDR; # вставляем ИП-адрес
print '"';
print " 40011007 "; # вставляем код
print ' "';
print $HostNAME; # вставляем описание - имя из DNS
print '"';
print ' "MASHEROVA-99" '; # вставляем рабочую группу
print "n";
}
### формируем первые 2 статические строки, которые описывают рабочие группы и их броузеры ###
print '"MASHEROVA-99" c0001000 "172.20.99.100" "MASHEROVA-99" ';
print "n";
print '"SKYNET" c0001000 "172.20.97.250" "SKYNET" ';
print "n";
$i = 1;
while ( $i < 255 ) { # сканировать все ИП-адреса до 254
$HostADDR = $NetADDR.$i; # текущий ИП-адрес
### создаем сокет (TCP-коннект на 139 порт) ###
my $sock = IO::Socket::INET->new(PeerAddr=> $HostADDR,
PeerPort => $port,
Proto => $proto,
Timeout => $Timeout ) && add_to_list; # в случае успеха выполнить подпрограмму
close($sock); # закрыть сокет
$i++; # и т.д. коннект на все ИП от 1 до 254
}
В результате выполнения скрипт выводит строки, в которых описываются
найденные компы. При таймауте 0,01 с на выполнение скрипта затрачивается
всего несколько секунд.
В зависимости от ОС вывод команды nslookup может отличаться, нужно
править под свои нужды. Если в сети нет DNS-сервера - можно сделать
просто текстовый файл с описанием пары "ИПшник имя" для всех компов и
брать имя оттуда. и еще обратите внимание, что в скрипте используются и
двойные кавычки, и одинарные кавычки и апостроф - все это имеет большое
значение.
Теперь остается только заменить исходный browse.dat. Но тут есть
загвоздка - если просто заменить файл, то Самба через минуту его опять
перезапишет. Чтобы этого не было, нужно запретить Самбе изменять файл
browse.dat. Я придумал только один способ - установить на browse.dat
флаг системного неизменяемого файла (schg), пока этот флаг стоит даже
root не может его изменить. Перед обновлением флаг снимается и опять
устанавливается. Все это делает еще один скриптик:
browser_update.pl
#!/usr/bin/perl
`/usr/local/browsing/scan139.pl > /var/lock/new_list`; # сканируем и кидаем список в new_list
sleep(10); # ждать 10 сек
`chflags noschg /var/lock/browse.dat`; # снимаем флаг schg
`cp /var/lock/new_list /var/lock/browse.dat`; # заменяем browse.dat содержимым new_list
`chflags schg /var/lock/browse.dat`; # устанавливаем флаг schg опять
Оба скрипта нужно сделать исполняемыми (мод +х). Чтобы сетевое окружение
обновлялось, нужно добавить задание для крона. Например, такое задание
обновляет список рабочей группы каждые 5 минут:
Естественно, все пути могут отличатся в зависимости от ОС и версии
Самбы. Тут уж я думаю опытные админы сами догадаются как найти и что
изменить. Если рабочих групп две (как в моем случае) - на каждую должен
быть отдельный мастер-броузер и запускать такой скрипт тоже на каждом.
442 Прочтений • [Samba: Модернизация "сетевого окружения" Windows (windows net perl wins samba dns freebsd)] [08.05.2012] [Комментариев: 0]