miércoles, mayo 10, 2006

Migrar usuarios en Linux (script)

Muy buenas, a continuación os pongo un script que cree hace un tiempo par poder migrar unos cuantos miles de usuarios de una máquina Linux a otra (Linux tambien). El script està hecho en perl y requiere el fichero "vars.pl" (Hay algunas líneas comentadas, ya que lo fuí modificando en función de mis intereses, pero si sabeis un poco de perl sabreis como adaptarlo a vuestras necesidades, es muy sencillo).
NOTA: Los datos los busca en los ficheros "users.src", "pwd.src" y "groups.src" para evitar sustos... (se trata de una copia de los ficheros que se encuentran en "/etc/" sin la extensión ".src"

create_users.pl

#!/usr/bin/perl

####
# Historia:
# 11/02/2004 - Axel - Creacio
#
#
# Descripcio:
# Migracio d'usuaris d'una maquina a un altre,
# demana el password per cada usuari creat.
# Crea els grups agafant-los d'un fitxer de
# tipus /etc/group
# Agafa els usuaris d'un fitxer, aixi com tota
# la resta de variables del fitxer /etc/passwd
#
####

########################## FUNCTIONS ##########################

sub loadGroups
#
# Carreguem el fitxer amb els grups que volem migrar.
# Nota: El fitxer ha de contindre un nom de grup per linea
# (es la manera de mantindre un control de grups creats)

{
local($target,*array)=@_;
open(F_IN,"$target") || die("error $!: cannot open groups file\n");
my($pointer)=0;
while(!eof(F_IN)) {
chop($line=);
$array[$pointer]=$line;
$pointer++;
}
if ($debug==1) {
print "\n Grups a migrar:\t @array\n";
}
close(F_IN);
}

##############################################################

sub loadUsers
#
# Carreguem el fitxer amb els usuaris que volem migrar (al array)
# Nota: El fitxer ha de seguir l'estructura del /etc/passwd

{
local($target,*array)=@_;
open(F_IN,"$target") || die("error $!: cannot open users file\n");
my($pointer)=0;
while(!eof(F_IN)) {
chop($line=);
$array[$pointer]=$line;
$pointer++;
}
if ($debug==1) {
print "\n Usuaris a migrar:\t @array\n";
}
close(F_IN);
}

##############################################################

sub loadPass
#
# Carreguem el fitxer amb els passwords encriptats pels usuaris
# Nota: El fitxer ha de seguir l'estructura del /etc/shadow

{
local($target,*array)=@_;
open(F_IN,"$target") || die("error $!: cannot open passwords file\n");
my($pointer)=0;
while(!eof(F_IN)) {
chop($line=);
$array[$pointer]=$line;
$pointer++;
}
if ($debug==1) {
print "\n Passwords a migrar:\t @array\n";
}
close(F_IN);
}

############################ MAIN ############################

require "vars.pl";

## ##
# Inicialitzacio #
## ##

#
# Carreguem els grups en memoria

loadGroups($target_groups,*groups);
$ngroups=@groups;

loadUsers($target_users,*users);
$nusers=@users;

loadPass($target_pass,*passwds);

#
# Comencem la migracio dels grups

#for ($i=0;$i<$ngroups;$i++) { # $groups[$i]=~s/\n//g; # @group=split(":",$groups[$i]); # if ($debug==1) { # print "\naddgroup $group[0]"; # } # else { # print "\ngroupadd $group[0] \n"; # system("$system_dir/addgroup","group[0]"); # } #} $count=0; for ($i=0;$i<$nusers;$i++) { $users[$i]=~s/\n//g; @user=split(":",$users[$i]); $passwds[$i]=~s/\n//g; @passwd=split(":",$passwds[$i]); if ($user[3]==$numgroup) { $count++; if ($debug==1) { print "\nuseradd -g $group_in_vars -c \"$user[4]\" -d $user[5] -s $user[6] -p '$passwd[1]' $user[0]"; # print "\npasswd $user[0]"; } else { # system("$system_dir/deluser","$user[0]"); print "\nuseradd -g $group_in_vars -c \"$user[4]\" -d $user[5] -s $user[6] -p $passwd[1] $user[0] \n"; system("$system_dir/useradd","-g","$group_in_vars","-c","\"$user[4]\"","-d","$user[5]","-s","$user[6]","-p","$passwd[1]","-M","$user[0]"); # print "\npasswd $user[0]\n"; # system("$system_dir/passwd","$user[0]"); } } else { print "\nNo es crea usuari, no pertany al grup $numgroup"; } print "\n\nUsuaris creats: $count"; }

----


A continuación os pongo el vars.pl

#########################################
# Variables d'entorn de create_users.pl #
#########################################

# Nom del servidor on realitzarem la migracio
$local_server="servername";

# Directoris locals dels executables necessaris
$system_dir="/usr/sbin";

# Localitzacio del fitxer de grups
$target_groups="groups.src";

# Localitzacio del fitxer de usuaris
$target_users="users.src";

# Localitzacio del fitxer de passwords
$target_pass="pwd.src";

# Grup al que sera afegit l'usuari
#$group_in_vars="";
$group_in_vars="smmsp";

# Grup al que pertany l'usuari del users.src en numero
$numgroup=12;

# Mode debug
# 0 -> no s'executa en mode debug
# 1 -> s'executa en mode debug
$debug=0;

1;

----

Espero que os haya sido de utilidad este script. En futuros posts os pondré otros muy útiles.