#!/opt/bin/perl -w $hostname = `hostname`; $hostname =~ s!\s+!!; # ============================= # Konfigurations-Parameter: # ============================= # Name und Pfad der Datei, die die Pseudo-passwd-Eintraege fuer die # geloeschten Benutzer aufnimmt: if ($hostname =~ m!^sunfi\d!i) { $passwd = '/var/yp/etc/passwd.subtract'; $remove_links = 0; # wegen Automounter Symlinks in /u nicht loeschen } else { $passwd = '/etc/passwd.subtract'; $remove_links = 1; # Symlinks /u/user --> /vol/rdisk... auch loeschen } # Mit Hilfe obiger Datei und dem Tool "disjoin" kann man die geloeschten # Benutzer von der /etc/passwd "subtrahieren"!!! # Dazu einfach nur (im jeweiligen Verzeichnis!) # disjoin passwd passwd.subtract # aufrufen. # Dann die Datei "passwd.0" in "passwd.ausgeschieden" umbenennen, # die Datei "passwd" in "passwd.backup" oder dergleichen umbenennen # und schliesslich die Datei "passwd.1" in "passwd" umbenennen. # (Und ggfs. im Verzeichnis "/var/yp" "make" aufrufen!) # Name und Pfad der Kommando-Datei fuer den Alias-Manager, mit deren Hilfe # die geloeschten Benutzer auch aus dem Mail-System geloescht werden koennen: $aliasadm = '/u/usenet/aliasadm.commands'; # Nach Durchlauf dieses Skripts als "usenet" einloggen, "aliasadm" eingeben, # dann obige Datei einlesen, das Ganze abspeichern, fertig. # Die Namen der Benutzer, die geloescht werden sollen: # (immer Vorname(n) und Nachname, durch Blanks getrennt!) # (jedoch _OHNE_ Titel (wie z.B. "Dr.") und sonstige Namens- # bestandteile (wie z.B. "von", "der")!!!) # (Es muessen nicht alle Vornamen angegeben werden, die Angaben muessen # den Benutzer nur eindeutig identifizieren!) @namen = ( 'Vorname Nachname', 'Vorname Nachname', 'Vorname Nachname', 'Vorname Nachname' ); # ====================================== # Ende des Konfigurations-Abschnitts # ====================================== unless (open(PASSWD, ">$passwd")) { die "can't write file '$passwd': $!\n"; } unless (open(ALIASADM, ">$aliasadm")) { die "can't write file '$aliasadm': $!\n"; } setpwent; while (($user,$name) = ((getpwent)[0,6])) { # print "'$user' = '$name'\n"; $name =~ s/[\t\r\n\f]/ /g; $name =~ s/ +/ /g; $name =~ s/^\s*//; $name =~ s/\s*$//; $name =~ s/\s*\(.*?\)\s*$//; # $name =~ s/^Dr[\.\s]\s*/Dr. /; $name =~ s/^Dr[\.\s]\s*//; # print "'$user' = '$name'\n"; if (defined $login{$user}) { warn "duplicate entry for login '$user'!\n"; } else { $login{$user} = $name; } } endpwent; for ( $i = 0; $i <= $#namen; $i++ ) { $fullname = $namen[$i]; undef @items; @items = split(' ', $fullname); $found = ''; $unique = 1; foreach $user (keys (%login)) { $name = $login{$user}; $match = 1; ITEM: foreach $item (@items) { unless ($name =~ m!\b$item\b!i) { $match = 0; last ITEM; } } if ($match) { if ($found) { $unique = 0; warn "'$fullname' matches '$found' and '$user'!\n"; } else { $found = $user; } } } if ($found && $unique) { $key[$i] = $found; print PASSWD "$found:*:10000:20000:$fullname:/u/$found:/opt/bin/bash\n"; print ALIASADM "del.user $found\n\n"; } elsif ($found) { warn "skipping ambiguous user '$fullname'!\n"; } else { warn "can't find user '$fullname'!\n"; } } close(PASSWD); close(ALIASADM); for ( $i = 0; $i <= $#namen; $i++ ) { $fullname = $namen[$i]; if (defined $key[$i]) { $user = $key[$i]; $dir = "/u/$user"; if (-e $dir) { # print "'$user' -> '$fullname'\n"; while (-l $dir) { $symlink = readlink($dir); if ($symlink =~ m!^/!) { $dir = $symlink; } else { $dir =~ s![^/]*$!$symlink!; } } while ($dir =~ m!/[^\./]+/\.\./!) { $dir =~ s!/[^\./]+/\.\./!/!g; } $dir =~ s!/$!!; # print "'$user' -> '$dir'\n"; if ($dir =~ m!^(?:/[^\./]+){2,}$!) { if (-d $dir) { print "\n"; print "system(\"rm -fr $dir\");\n"; print "\n"; print "Execute this command? (Yes/No) "; $response = ; print "\n"; if ($response =~ /^Y/i) { print "EXECUTING command 'system(\"rm -fr $dir\");'!\n"; system("rm -fr $dir"); if ($remove_links) { system("rm -f /u/$user"); } } else { print "Skipping command 'system(\"rm -fr $dir\");'.\n"; } } else { warn "directory '$dir' does not exist!\n"; } } else { warn "directory '$dir' considered too dangerous!\n"; } } else { warn "directory '$dir' does not exist!\n"; } } } __END__