tags:

views:

74

answers:

4

I have a standard passwd file & a usermap file - which maps unix name (eg jbloggs) with AD account name (eg bloggsjoe) in the format:
jbloggs bloggsjoe
jsmith smithjohn
... etc.
How can I edit the passwd file to swap the original unix name with the AD account name so each line of the passwd file has the AD account name instead.
Appreciate any help for a perl learner.

+1  A: 
#! /usr/bin/perl -T

use strict;
use warnings;
use File::Slurp 'slurp';

my ($map_file, $pass_file) = @ARGV or die 'No arguments given!';

my %ad_for;

for my $line (slurp($map_file)) {
    chomp $line;
    my ($unix, $ad) = split / /, $line;
    $ad_for{$unix} = $ad;
}

for my $line (slurp($pass_file)) {
    my ($name, @entries) = split /:/, $line;
    if ($ad_for{$name}) {
        print join ':', $ad_for{$name}, @entries;
    }
    else {
        warn "name $name doesn't have an ad entry\n";
    }
}
Leon Timmermans
Thanks, now I don't have to write it.
Brian Rasmussen
A: 

With Perl, read the AD file in and populate an AD-Unix hash, which you can then use to perform the replacement with a one-liner. This assumes that you have no duplicate usernames, of course.

(Untested)

my %AD;

system ("perl -ane '$AD{$F[0]} = $F[1]' unixMap.txt");
system ("perl -i -ape 's/$F[0]/$AD{$F[0]}/' passwordFile.txt");
Zaid
A: 

here's a awk one liner to do that

$ cat map.txt
jbloggs bloggsjoe
jsmith smithjohn

$ cat passwd
root:x:0:0:root:/root:/bin/bash
jbloggs:x:493:484:Blogger:/var/run/lib:/sbin/nologin
jsmith:x:27:481:MySQL Server user:/var/lib/mysql:/bin/bash

$ awk -F":" 'FNR==NR{gsub(" +",":");m[$1]=$2;next}($1 in m){$1=m[$1]}1' OFS=":"  map.txt passwd
root:x:0:0:root:/root:/bin/bash
bloggsjoe:x:493:484:Blogger:/var/run/lib:/sbin/nologin
smithjohn:x:27:481:MySQL Server user:/var/lib/mysql:/bin/bash
ghostdog74
A: 

Use Passwd::Unix. It will coordinate the editing of /etc/passwd, /etc/shadow, and /etc/group for you. Be sure to backup these files before you try editing them.

unutbu