Perl Linux PW ändern

Registriert
Sep. 2010
Beiträge
174
Moin,
ich möchte mittels Perl ein Passwort eines Nutzers ändern. passwd kann man ja nicht nutzn, weil man da das passwort selbst eingeben muss. habe folgende funktion gefunden:

Perl:
sub change_password # (user, newpass){
  # Gegebenenfalls sind die Pfade von 'cp' und 'sed' anzupassen!
  #
  # can only be done as root
  # Errorcodes:
  #   0  O.K.
  #   1  User does not exist
  #   2  More than one user
  #   3  Error while copying $passwd to $ptmp
  #   4  Changing $ptmp failed
  #   5  Error while copying $ptmp to $passwd

  my $user = @_[0];
  my $newpass = @_[1];
  my @saltset = ('a' .. 'z', 'A' .. 'Z', '0' .. '9', '.', '/');
  my $ptmp = '/etc/ptmp';
  my $passwd = '/etc/shadow';
  my @entry = ();
  my @rest=();
  my $name = '';
  my $oldcrypt = '';
  my $newcrypt = '';
  my $salt = '';
  my $ok = '';
  my $line = '';
  
  srand(time|$$);
  open(PASSWD,'<' . $passwd);
  @entry = grep(/^$user:/,<PASSWD>);
  close PASSWD;
  return(1) if ($#entry == -1); 
  return(2) if ($#entry != 0); 
  $line = shift(@entry);
  ($name, $oldcrypt, @rest) = split(/:/, $line);
  $salt = $saltset[rand(62)] . $saltset[rand(62)];    # form new salt
  $newcrypt = crypt($newpass,$salt);  	# form new encrypted password
  
  sleep(2) while ( -f $ptmp ); 
  $ok = system("/bin/cp $passwd $ptmp");
  return(3) if ($ok != 0); 
  $ok = system("/usr/bin/sed -e 's/^$user:$oldcrypt:/$user:$newcrypt:/' $passwd > $ptmp");
  if ($ok != 0) 
    {
    unlink($ptmp);
    return(4);
    }
  $ok = system("/bin/cp $ptmp $passwd");
  if ($ok != 0) 
    {
    print "RED ALERT! Couldn't update $passwd. Backup file is $ptmp\n";
    return(5);
    }
  unlink($ptmp);
  return(0);	
  }

Funzt nicht, bekomme folgende meldung:
/usr/bin/sed: -e Ausdruck #1, Zeichen 55: Unbekannte Option für `s'
 
#1 Tip: Erste Zeile :)
#2 Tip:
Welches '{' passt zum '}' in Zeile 55
#3 Tip:
Die Klammern sind falsch, weil in Zeile 1 die geschweifte Klammer auskommentiert ist
 
Wenn du passwd als root ausführst, musst du das alte Passwort nicht eingeben. Insofern sehe ich nicht, was dir das Perl Script bringen sollte (denn das musst du auch als Root ausführen).

TLDR; Benutz passwd.
 
habs nu geändert
Perl:
sub change_password(){ # (user, newpass)
# can only be done as root
# Errorcodes:
#   0  O.K.
#   1  User does not exist
#   2  More than one user
#   3  Error while copying $passwd to $ptmp
#   4  Changing $ptmp failed
#   5  Error while copying $ptmp to $passwd
  my $user = @_[0];
  my $newpass = @_[1];
  my @saltset = ('a' .. 'z', 'A' .. 'Z', '0' .. '9', '.', '/');
  my $ptmp = '/etc/ptmp';
  my $passwd = '/etc/shadow';
  my @entry = ();
  my @rest=();
  my $name = '';
  my $oldcrypt = '';
  my $newcrypt = '';
  my $salt = '';
  my $ok = '';
  my $line = '';
  
  srand(time|$$);
  open(PASSWD,'<' . $passwd);
  @entry = grep(/^$user:/,<PASSWD>);
  close PASSWD;
  return(1) if ($#entry == -1); 
  return(2) if ($#entry != 0); 
  $line = shift(@entry);
  ($name, $oldcrypt, @rest) = split(/:/, $line);
  $salt = $saltset[rand(62)] . $saltset[rand(62)];    # form new salt
  $newcrypt = crypt($newpass,$salt);  	# form new encrypted password
  
  sleep(2) while ( -f $ptmp ); 
  $ok = system("/bin/cp $passwd $ptmp");
  return(3) if ($ok != 0); 
  $ok = system("/usr/bin/sed -e 's/^$user:$oldcrypt:/$user:$newcrypt:/' $passwd > $ptmp");
  if ($ok != 0){
  	unlink($ptmp);
    return(4);
  }
  $ok = system("/bin/cp $ptmp $passwd");
  if ($ok != 0){
    print "RED ALERT! Couldn't update $passwd. Backup file is $ptmp\n";
    return(5);
  }
  unlink($ptmp);
  return(0);	
} 
iert
Bekomme aber 1 als returnwert, also scheint der user nicht zu exestieren. habe aber nachgeprüft mit su USE und der exest
Ergänzung ()

Wenn ich passwd ausführe muss ich ja das neue passwort zweimal eingeben, und dass ist etwas schlecht wenns im Backend aufem Server läuft
 
Zurück
Oben