#/usr/local/bin/perl
#
# Usage: suidfind.pl [-n] [-s secure_dir] [search_starting_directory]
#
require "getopts.pl";
die $usage unless &getopts'Getopts('n');
# Do NFS stuff? Yes unless opt:
if (defined($opt_n)) { $skip_nfs = $opt_n; }
else { $skip_nfs = 0; }
if (@ARGV > 1) { die $usage; }
elsif (@ARGV == 1) { $start_dir = shift; }
# these may be terribly rash assumptions....
$start_dir="/" unless defined $start_dir;
@rwx = ('---','--x','-w-','-wx','r--','r-x','rw-','rwx');
@moname = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
while (($name, $pw, $uid) = getpwent) {
$user{$uid} = $name unless $user{$uid};
}
while (($name, $pw, $gid) = getgrent) {
$group{$gid} = $name unless $group{$gid};
}
require "find.pl";
# Traverse desired filesystems
&find($start_dir);
exit;
sub wanted {
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
-d _ &&
( $skip_nfs &&
($dev < 0 || $dev >= 16384) &&
($prune = 1)
)
||
-f _ &&
(
($mode & 04000) == 04000
||
($mode & 02000) == 02000
) &&
&ls;
}
sub ls {
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$sizemm,
$atime,$mtime,$ctime,$blksize,$blocks) = lstat(_);
$pname = $name;
if (defined $blocks) {
$blocks = int(($blocks + 1) / 2);
}
else {
$blocks = int(($size + 1023) / 1024);
}
if (-f _) { $perms = '-'; }
elsif (-d _) { $perms = 'd'; }
elsif (-c _) { $perms = 'c'; $sizemm = &sizemm; }
elsif (-b _) { $perms = 'b'; $sizemm = &sizemm; }
elsif (-p _) { $perms = 'p'; }
elsif (-S _) { $perms = 's'; }
else { $perms = 'l'; $pname .= ' -> ' . readlink($_); }
$tmpmode = $mode;
$tmp = $rwx[$tmpmode & 7];
$tmpmode >>= 3;
$tmp = $rwx[$tmpmode & 7] . $tmp;
$tmpmode >>= 3;
$tmp = $rwx[$tmpmode & 7] . $tmp;
substr($tmp,2,1) =~ tr/-x/Ss/ if -u _;
substr($tmp,5,1) =~ tr/-x/Ss/ if -g _;
substr($tmp,8,1) =~ tr/-x/Tt/ if -k _;
$perms .= $tmp;
$user = $user{$uid} || $uid;
$group = $group{$gid} || $gid;
($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
$moname = $moname[$mon];
if (-M _ > 365.25 / 2) {
$timeyear = '19' . $year;
}
else {
$timeyear = sprintf("%02d:%02d", $hour, $min);
}
printf "%5lu %4ld %-10s %2d %-8s %-8s %8s %s %2d %5s %s\n",
$ino,
$blocks,
$perms,
$nlink,
$user,
$group,
$sizemm,
$moname,
$mday,
$timeyear,
$pname;
1;
}
sub sizemm {
sprintf("%3d, %3d", ($rdev >> 8) & 255, $rdev & 255);
}