1#!/usr/bin/perl 2# 3# Prints info on all smb responding machines on a subnet. 4# This script needs to be run on a machine without nmbd running and be 5# run as root to get correct info from WIN95 clients. 6# 7# syntax: 8# findsmb [subnet broadcast address] 9# 10# with no agrument it will list machines on the current subnet 11# 12# There will be a "+" in front of the workgroup name for machines that are 13# local master browsers for that workgroup. There will be an "*" in front 14# of the workgroup name for machines that are the domain master browser for 15# that workgroup. 16# 17 18$SAMBABIN = "/usr/bin"; 19 20for ($i = 0; $i < 2; $i++) { # test for -d option and broadcast address 21 $_ = shift; 22 if (m/-d|-D/) { 23 $DEBUG = 1; 24 } else { 25 if ($_) { 26 $BCAST = "-B $_"; 27 } 28 } 29} 30 31sub ipsort # do numeric sort on last field of IP address 32{ 33 @t1 = split(/\./,$a); 34 @t2 = split(/\./,$b); 35 @t1[3] <=> @t2[3]; 36} 37 38# look for all machines that respond to a name lookup 39 40open(NMBLOOKUP,"$SAMBABIN/nmblookup $BCAST '*'|") || 41 die("Can't run nmblookup '*'.\n"); 42 43# get rid of all lines that are not a response IP address, 44# strip everything but IP address and sort by last field in address 45 46@ipaddrs = sort ipsort grep(s/ \*<00>.*$//,<NMBLOOKUP>); 47 48# print header info 49 50print "\nIP ADDR NETBIOS NAME WORKGROUP/OS/VERSION $BCAST\n"; 51print "---------------------------------------------------------------------\n"; 52 53foreach $ip (@ipaddrs) # loop through each IP address found 54{ 55 $ip =~ s/\n//; # strip newline from IP address 56 57# find the netbios names registered by each machine 58 59 open(NMBLOOKUP,"$SAMBABIN/nmblookup -r -A $ip|") || 60 die("Can't get nmb name list.\n"); 61 @nmblookup = <NMBLOOKUP>; 62 close NMBLOOKUP; 63 64# get the first <00> name 65 66 @name = grep(/<00>/,@nmblookup); 67 $_ = @name[0]; 68 if ($_) { # we have a netbios name 69 if (/GROUP/) { # is it a group name 70 ($name, $aliases, $type, $length, @addresses) = 71 gethostbyaddr(pack('C4',split('\.',$ip)),2); 72 if (! $name) { # could not get name 73 $name = "unknown nis name"; 74 } 75 } else { 76 /(\S+)/; 77 $name = $1; 78 } 79 80# do an smbclient command on the netbios name. 81 82 open(SMB,"$SAMBABIN/smbclient -N -L $name -I $ip -U% |") || 83 die("Can't do smbclient command.\n"); 84 @smb = <SMB>; 85 close SMB; 86 87 if ($DEBUG) { # if -d flag print results of nmblookup and smbclient 88 print "===============================================================\n"; 89 print @nmblookup; 90 print @smb; 91 } 92 93# look for the OS= string 94 95 @info = grep(/OS=/,@smb); 96 $_ = @info[0]; 97 if ($_) { # we found response 98 s/Domain=|OS=|Server=|\n//g; # strip out descriptions to make line shorter 99 100 } else { # no OS= string in response (WIN95 client) 101 102# for WIN95 clients get workgroup name from nmblookup response 103 @name = grep(/<00> - <GROUP>/,@nmblookup); 104 $_ = @name[0]; 105 if ($_) { 106 /(\S+)/; 107 $_ = "[$1]"; 108 } else { 109 $_ = "Unknown Workgroup"; 110 } 111 } 112 113# see if machine registered a local master browser name 114 if (grep(/<1d>/,@nmblookup)) { 115 $master = '+'; # indicate local master browser 116 if (grep(/<1b>/,@nmblookup)) { # how about domain master browser? 117 $master = '*'; # indicate domain master browser 118 } 119 } else { 120 $master = ' '; # not a browse master 121 } 122 123# line up info in 3 columns 124 125 print "$ip".' 'x(16-length($ip))."$name".' 'x(14-length($name))."$master"."$_\n"; 126 127 } else { # no netbios name found 128# try getting the host name 129 ($name, $aliases, $type, $length, @addresses) = 130 gethostbyaddr(pack('C4',split('\.',$ip)),2); 131 if (! $name) { # could not get name 132 $name = "unknown nis name"; 133 } 134 if ($DEBUG) { # if -d flag print results of nmblookup 135 print "===============================================================\n"; 136 print @nmblookup; 137 } 138 print "$ip".' 'x(16-length($ip))."$name\n"; 139 } 140} 141 142