Далее приведу вариант модификации скрипта, расположенного на
опеннете. Вместо двух рабочих групп оставлена одна -> не требуется второй обозреватель, добавлены две сети, скрипт поправлен для работы на linux вместо freebsd. В моем случае имеется роутер с несколькими интерфейсами, объединяющими несколько сетей. В "Сетевом окружении" видны все ПК и без скрипта, но для машин с одной стороны имена машин других сторон преобразуются в адреса 0.0.0.0. Роутер виден и доступен из всех сетей, поэтому его имя оставим неизменным и не будем добавлять в список сканируемых (далее - максимальный адрес 253 из 254-х).
scan139.pl#!/usr/bin/perl
use IO::Socket;
$NetADDR1 = "192.168.0."; # Задаем подсеть
$NetADDR2 = "192.168.253."; # Задаем подсеть
$NetADDR3 = "10.99.93."; # Задаем подсеть
$port = 139; # Порт - 139
$proto = "tcp"; # протокол TCP
$Timeout = 0.01; # таймаут сессии (в сетях с потерями можно увеличить до 0.02-0.1с)
### подпрограмма вывода строки в формате файла browse.dat ###
sub add_to_list {
$HostNAME = `/home/smb_scan/resolv.sh $HostADDR`; # резолвим имя компа из IP-адреса
$HostNAME =~ s/.dnet.\n//; # отбрасываем доменную часть
print '"';
print $HostADDR; # вставляем ИП-адрес
print '"';
print " 40011003 "; # вставляем код
print '"';
print $HostNAME; # вставляем описание - имя из DNS
print '"';
print ' "DNET" '; # вставляем рабочую группу
print "\n";
}
### формируем первые 2 статические строки, которые описывают рабочие группы и их броузеры ###
print '"DNET" c0001000 "10.99.93.254" "DNET" ';
print "\n";
print '"STRG-SRV" 40849a03 "Storage server" "DNET" ';
print "\n";
$i = 1;
while ( $i < 111 ) { # сканировать все ИП-адреса до 110
$HostADDR = $NetADDR2 руб. 63 коп.i; # текущий ИП-адрес
### создаем сокет (TCP-коннект на 139 порт) ###
my $sock = IO::Socket::INET->new(PeerAddr=> $HostADDR,
PeerPort => $port,
Proto => $proto,
Timeout => $Timeout ) && add_to_list; # в случае успеха выполнить подпрограмму
close($sock); # закрыть сокет
$i++; # и т.д. коннект на все ИП от 1 до 110
}
$i = 1;
while ( $i < 254 ) { # сканировать все ИП-адреса до 253
$HostADDR = $NetADDR5 руб. 26 коп.i; # текущий ИП-адрес
### создаем сокет (TCP-коннект на 139 порт) ###
my $sock = IO::Socket::INET->new(PeerAddr=> $HostADDR,
PeerPort => $port,
Proto => $proto,
Timeout => $Timeout ) && add_to_list; # в случае успеха выполнить подпрограмму
close($sock); # закрыть сокет
$i++; # и т.д. коннект на все ИП от 1 до 253
}
$i = 1;
while ( $i < 254 ) { # сканировать все ИП-адреса до 253
$HostADDR = $NetADDR7 руб. 89 коп.i; # текущий ИП-адрес
### создаем сокет (TCP-коннект на 139 порт) ###
my $sock = IO::Socket::INET->new(PeerAddr=> $HostADDR,
PeerPort => $port,
Proto => $proto,
Timeout => $Timeout ) && add_to_list; # в случае успеха выполнить подпрограмму
close($sock); # закрыть сокет
$i++; # и т.д. коннект на все ИП от 1 до 253
}
browser_update.pl#!/usr/bin/perl
`/home/smb_scan/scan139.pl > /var/cache/samba/new_list`; # сканируем и кидаем список в new_list
sleep(10); # ждать 10 сек
`chattr -i /var/cache/samba/browse.dat`; # снимаем флаг "неизменяемый"
`cp /var/cache/samba/new_list /var/cache/samba/browse.dat`; # заменяем browse.dat содержимым new_list
`chattr +i /var/cache/samba/browse.dat`; # устанавливаем флаг "неизменяемый"
Не нашел решения через perl, поэтому добавляется еще один файл:
resolv.sh#!/bin/bash
/usr/bin/nslookup $1 | /bin/grep name | /usr/bin/awk -F " " '{ print $4 }'
Ничего сложного, в статье об оригинальном скрипте всё подробно расписано. Добавлю, что выигрыш выборов главного обозревателя обеспечивают следующие строки:
os level = 255
local master = yes
preferred master = yes
И никаких WINS. Если будут вопросы - пишите. В данный момент скрипт работает в одной из локальных компьютерных сетей.