mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
25ea54ef9c
(This used to be commit 9f8cb4906f
)
142 lines
3.9 KiB
Perl
Executable File
142 lines
3.9 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
#
|
|
# Prints info on all smb responding machines on a subnet.
|
|
# This script needs to be run on a machine without nmbd running and be
|
|
# run as root to get correct info from WIN95 clients.
|
|
#
|
|
# syntax:
|
|
# findsmb [subnet broadcast address]
|
|
#
|
|
# with no agrument it will list machines on the current subnet
|
|
#
|
|
# There will be a "+" in front of the workgroup name for machines that are
|
|
# local master browsers for that workgroup. There will be an "*" in front
|
|
# of the workgroup name for machines that are the domain master browser for
|
|
# that workgroup.
|
|
#
|
|
|
|
$SAMBABIN = "/usr/bin";
|
|
|
|
for ($i = 0; $i < 2; $i++) { # test for -d option and broadcast address
|
|
$_ = shift;
|
|
if (m/-d|-D/) {
|
|
$DEBUG = 1;
|
|
} else {
|
|
if ($_) {
|
|
$BCAST = "-B $_";
|
|
}
|
|
}
|
|
}
|
|
|
|
sub ipsort # do numeric sort on last field of IP address
|
|
{
|
|
@t1 = split(/\./,$a);
|
|
@t2 = split(/\./,$b);
|
|
@t1[3] <=> @t2[3];
|
|
}
|
|
|
|
# look for all machines that respond to a name lookup
|
|
|
|
open(NMBLOOKUP,"$SAMBABIN/nmblookup $BCAST '*'|") ||
|
|
die("Can't run nmblookup '*'.\n");
|
|
|
|
# get rid of all lines that are not a response IP address,
|
|
# strip everything but IP address and sort by last field in address
|
|
|
|
@ipaddrs = sort ipsort grep(s/ \*<00>.*$//,<NMBLOOKUP>);
|
|
|
|
# print header info
|
|
|
|
print "\nIP ADDR NETBIOS NAME WORKGROUP/OS/VERSION $BCAST\n";
|
|
print "---------------------------------------------------------------------\n";
|
|
|
|
foreach $ip (@ipaddrs) # loop through each IP address found
|
|
{
|
|
$ip =~ s/\n//; # strip newline from IP address
|
|
|
|
# find the netbios names registered by each machine
|
|
|
|
open(NMBLOOKUP,"$SAMBABIN/nmblookup -r -A $ip|") ||
|
|
die("Can't get nmb name list.\n");
|
|
@nmblookup = <NMBLOOKUP>;
|
|
close NMBLOOKUP;
|
|
|
|
# get the first <00> name
|
|
|
|
@name = grep(/<00>/,@nmblookup);
|
|
$_ = @name[0];
|
|
if ($_) { # we have a netbios name
|
|
if (/GROUP/) { # is it a group name
|
|
($name, $aliases, $type, $length, @addresses) =
|
|
gethostbyaddr(pack('C4',split('\.',$ip)),2);
|
|
if (! $name) { # could not get name
|
|
$name = "unknown nis name";
|
|
}
|
|
} else {
|
|
/(\S+)/;
|
|
$name = $1;
|
|
}
|
|
|
|
# do an smbclient command on the netbios name.
|
|
|
|
open(SMB,"$SAMBABIN/smbclient -N -L $name -I $ip -U% |") ||
|
|
die("Can't do smbclient command.\n");
|
|
@smb = <SMB>;
|
|
close SMB;
|
|
|
|
if ($DEBUG) { # if -d flag print results of nmblookup and smbclient
|
|
print "===============================================================\n";
|
|
print @nmblookup;
|
|
print @smb;
|
|
}
|
|
|
|
# look for the OS= string
|
|
|
|
@info = grep(/OS=/,@smb);
|
|
$_ = @info[0];
|
|
if ($_) { # we found response
|
|
s/Domain=|OS=|Server=|\n//g; # strip out descriptions to make line shorter
|
|
|
|
} else { # no OS= string in response (WIN95 client)
|
|
|
|
# for WIN95 clients get workgroup name from nmblookup response
|
|
@name = grep(/<00> - <GROUP>/,@nmblookup);
|
|
$_ = @name[0];
|
|
if ($_) {
|
|
/(\S+)/;
|
|
$_ = "[$1]";
|
|
} else {
|
|
$_ = "Unknown Workgroup";
|
|
}
|
|
}
|
|
|
|
# see if machine registered a local master browser name
|
|
if (grep(/<1d>/,@nmblookup)) {
|
|
$master = '+'; # indicate local master browser
|
|
if (grep(/<1b>/,@nmblookup)) { # how about domain master browser?
|
|
$master = '*'; # indicate domain master browser
|
|
}
|
|
} else {
|
|
$master = ' '; # not a browse master
|
|
}
|
|
|
|
# line up info in 3 columns
|
|
|
|
print "$ip".' 'x(16-length($ip))."$name".' 'x(14-length($name))."$master"."$_\n";
|
|
|
|
} else { # no netbios name found
|
|
# try getting the host name
|
|
($name, $aliases, $type, $length, @addresses) =
|
|
gethostbyaddr(pack('C4',split('\.',$ip)),2);
|
|
if (! $name) { # could not get name
|
|
$name = "unknown nis name";
|
|
}
|
|
if ($DEBUG) { # if -d flag print results of nmblookup
|
|
print "===============================================================\n";
|
|
print @nmblookup;
|
|
}
|
|
print "$ip".' 'x(16-length($ip))."$name\n";
|
|
}
|
|
}
|
|
|