Re: Need help in comparing permissions/ownerships on different systems
"snoopy_@excite.com" typed:
[Follow-up set to comp.lang.perl.misc]
It results in a csv file contining perms on one system, then I could
use this to compare:
-rw-rw----,egatereg,egateg,/d00/app/home/egatereg/schemas/ss.runtime.tar
-rw-rw----,egatereg,egateg,/d00/app/home/egatereg/schemas/trn.modules.dat
-rw-rw----,egatereg,egateg,/d00/app/home/egatereg/schemas/trn.runtime.tar
Not how to interpret "-rwx" fields. Thought of perl with expression
matching, or using the File:stat modules. Doesn't seem pratical.
Any other ideas?
I once had a need to do something similar. I never completed the
application. The need either thined away into insignificance, or the
damage done wasn't so serious as had been presumed initially (the lead web
developer had accidentaly run `chmod -R 777 /` on one production system I
administrate). Nonetheless, the following snippet from the application
might help you. You might want to use a different module to traverse the
filesystem, as File::Glob doesn't quite work as I wanted it to.
sub read_filesystem
{
my $startpath = shift;
# Limitation: Doesn't do recursive globbing.
use File::Glob ':glob';
my @files = glob($startpath);
use File::Stat::Ls qw(:all);
foreach my $file (@files) {
my @filestat = stat($file);
my ($mode, $uid, $gid) = ($filestat[2], $filestat[4], $filestat[5]);
my $file_obj = File::Stat::Ls->new;
my $perm = $file_obj->format_mode($mode);
my $octal = &convert_to_octal($perm);
# Quick hack to workaround the fact that directory entries read from
# MANIFEST have a trailing "/" character attached to them. Globbing
# does not behave the same way with respect to directory entries.
$file .= "/" if -d $file;
$fs_live{$file} = [$uid, $gid, $perm, $octal];
}
}
###
### Given a string like "-rwx-r-xr-x", return equivalent octal representation.
###
sub convert_to_octal
{
my $perm = shift;
my $octal;
my ($special, $user, $group, $other) = (0, 0, 0, 0);
my ($x, $ur, $uw, $ux, $gr, $gw, $gx, $or, $ow, $ox) = split //, $perm;
$user += 4 if $ur eq 'r';
$user += 2 if $uw eq 'w';
$user += 1 if $ux eq 'x';
if ($ux eq 's') { $user += 1; $special += 4; }
$group += 4 if $gr eq 'r';
$group += 2 if $gw eq 'w';
$group += 1 if $gx eq 'x';
if ($gx eq 's') { $group += 1; $special += 2; }
$other += 4 if $or eq 'r';
$other += 2 if $ow eq 'w';
$other += 1 if $ox eq 'x';
if ($ox eq 't') { $other += 1; $special += 1; }
$octal = $special . $user . $group . $other;
return $octal;
}
I suggest reading through a few tutorials explaining Unix/Linux file modes
and permissions.
--
Ayaz Ahmed Khan
It is impossible to defend perfectly against the attack of those who
want to die.