[Linux-Biella] dopo tante ricerche...

LeOS linux@bilug.linux.it
Mon, 18 Nov 2002 11:25:27 +0100


senza esito... mi son codato il programma ke mi serviva...
praticamente avevo necessita' di poter manipolare un file contentente 
user e password hashata in  MD5
nei termini taaaaaanto tempo fa avevo un programma chiamato mypwd che 
funzionava cosi':
mypwd user pass file
e lui apriva il file, verificava l'esistenza di user e ne modificava la 
pass hashandola, se invece questo user non esisteva, aggiungeva la riga 
in fondo al file.
funzionava benissimo se non fosse per il fatto che era stato compilato 
con librerie non statiche e non funzionava se non con la slack 7.1
quindi me lo sono rifatto :)
con un paio di modifiche:
1: e' possibile omettere il nome del file di destinazione, cosi' facendo 
viene semplicemente visualizzato a schermo user:passhashed
2: se il programma incontra file di password complessi tipo shadow o che 
altro, quindi con altri parametri oltre al semplice username e password, 
mantiene anche quello che segue

3: do' per scontato che il file in questione abbia come primo valore 
username e come secondo valore la password, divisi tra loro da i 
classici due punti.

engioi:

#!/usr/bin/perl

# finalmente dopo mille peripezie abbiamo finito mypwd
# se scrivo:
# mypwd user pass
# senza definire un output file
# mi visualizza semplicemente user:passwdMD5
#
# se invece scrivo
# mypwd user pass file
# apre il file
# verifica l'esistenza di user
# se esiste sostituisce la riga
# se non esiste aggiunge la riga in fondo
# serve il modulo: Crypt-PasswdMD5-1.2

$user = $ARGV[0];
$pass = $ARGV[1];
$file = $ARGV[2];

if ($user eq ""){
  printf "usage:\nmypwd user pass outputfile\n\n";
  exit;
}


use Crypt::PasswdMD5;
my $salt;
  $cryptedpass = unix_md5_crypt($pass, $salt);
  if ($file eq ""){
    printf "$user:$cryptedpass\n";
  }
  else{
    &mod_add();
  }

exit;


sub mod_add {

  # apro il file e lo memorizzo in un array
  open(readfile, "< $file") or die "Couldn't open $file $!\n";
    @riga = <readfile>;
  close(readfile);

  $lung = @riga-1;

  # eseguo la scanZione dell'array
  $sost = 0;
  for ($cnt = 0;$cnt <= $lung; $cnt++){
    chomp($riga[$cnt]);

    my @rigasplit;
    @rigasplit=split("\\:",$riga[$cnt]);
    $quanticampi=@rigasplit;
    # lo user esiste...
    if ($rigasplit[0] eq $user){
      #$riga[$cnt] = "$user:$cryptedpass";
      $riga[$cnt] = "$user";
      $sost = 1;
      for($cntcampi=1;$cntcampi<$quanticampi;$cntcampi++){
        $riga[$cnt]=$riga[$cnt].":".$rigasplit[$cntcampi];
      }
    }
  }

  if ($sost != 1){
    $lung++;
    $riga[$lung] = "$user:$cryptedpass";
  }

  open (writefile, "> $file") || die "Stocazzo!!!";
    for($cnt = 0; $cnt <= $lung ;$cnt ++){
      print writefile "$riga[$cnt]\n";
    }
  close (writefile);
}