[Linux-Biella] dopo tante ricerche...

LeOS linux@bilug.linux.it
Mon, 18 Nov 2002 11:36:15 +0100


LeOS wrote:

>
> senza esito... mi son codato il programma ke mi serviva...

chiedo venia... c'era un bug nato dopo una modifica che pensavo indolore...

ecco il codice riveduto e corretto:

#!/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;
}

if (-e $file){
  system ("cp $file $file.old");
}

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:$cryptedpass";
      $sost = 1;
      for($cntcampi=2;$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);
}