#!/usr/bin/env perl use strict; use warnings; my $passwd = '/etc/passwd'; open my $fh, '<', $passwd or die "Cannot open $passwd: $!\n"; my (%uid_seen, %user_seen, %uid_dups, %user_dups); while (my $line = <$fh>) { chomp $line; next if $line =~ /^\s*#/ || $line eq ''; my @f = split /:/, $line; next unless @f >= 3; my ($user, undef, $uid) = @f[0,1,2]; push @{ $uid_dups{$uid} }, $user if exists $uid_seen{$uid}; $uid_seen{$uid} = $user; push @{ $user_dups{$user} }, $uid if exists $user_seen{$user}; $user_seen{$user} = $uid; } close $fh; if (!%uid_dups && !%user_dups) { print "No duplicate UIDs or usernames found.\n"; exit 0; } if (%uid_dups) { print "Duplicate UIDs:\n"; for my $uid (sort { $a <=> $b } keys %uid_dups) { my @users = do { my %seen; grep { !$seen{$_}++ } ($uid_seen{$uid}, @{ $uid_dups{$uid} }); }; print " UID $uid: ", join(", ", @users), "\n"; } } if (%user_dups) { print "Duplicate usernames:\n"; for my $user (sort keys %user_dups) { my %seen_uids; my @uids = grep { !$seen_uids{$_}++ } ($user_seen{$user}, @{ $user_dups{$user} }); print " $user: UID(s) ", join(", ", @uids), "\n"; } }