Gå til innhold

[Løst]Legge til brukere med Perl


Anbefalte innlegg

Heisann,

 

Jeg holder på å lage et script som skal opprette en bruker i et linux system.

 

Slik det kjører nå så vil ikke passordet legge seg inn i /etc/shadow filen.

IStedetfor står det et 1-tall der passordet skal stå.

 

Noen som vet hva jeg må gjøre her?

Scriptet kjører og oppretter alt unntatt selve passordet :(

 

#!/usr/bin/perl
# Script for adding new users, giving a generic passwd
#
# ***Declare Variables***
#
	print "Please enter a username to create\n";
my $username = <STDIN>;
	chomp ($username);
#
	print "Please enter the users Real Name\n";
my $realname = <STDIN>;
	chomp ($realname);

# **Lager en MD5 hash av passordet:

my $tmpPassword = "";

print generatePassword(15) . "\n";
# exit;
sub generatePassword {
$length = shift;
$possible = 'abcdefghijkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
while (length($tmpPassword) < $length) {
	$tmpPassword .= substr($possible, (int(rand(length($possible)))), 1);
	}
	 return $tmpPassword
  }

#  open (MYOUTFILE, '>passord.txt');

# close (MYOUTFILE);

# ***End Variables***
# Setup hashes
#
$md5password = print crypt("hahaha", "\$1\$j5nZfGq2");

my %useraddcmd = (
useradd => "/usr/sbin/useradd $username -g users -c \"$realname\" -p $md5password",
);

# End hashes
# Now on to add the actual username
#
	print "Do you want to create $username Y/n?\n";
$_ = <STDIN>;
chomp;
$_ = "Y" if (length($_) == 0);
# add user
if ($_ =~ /[Yy]/) {
		print "Adding user $username...\n";
		system ($useraddcmd {'useradd'});

}
else {
		print "Can't create user\n";
}

Endret av Haavard82
Lenke til kommentar
Videoannonse
Annonse

Dette scriptet fungerer:

 

Det forutsetter at følgende er installert:

perl -MCPAN -e shell

 

cpan> install Crypt::PasswdMD5

 

For debian:

apt-get update && apt-get install libcrypt-passwdmd5-perl

 

#!/usr/bin/perl
# Script for adding new users, giving a generic passwd
# and setting them up appropriately in /etc/sudoers
# Sudoers for the DBA's
#
# ***Declare Variables***
#

# use strict;
use Crypt::PasswdMD5;

my $password = "";
my $md5password = "";
my $salt = '$1$qwertyuz';
my $length = "";
my $possible = "";

print "Please enter a username to create\n";
my $username = <STDIN>;
	chomp ($username);
#
	print "Please enter the users Real Name\n";
my $realname = <STDIN>;
	chomp ($realname);

# ***End Variables***
# Setup hashes
#

print generatePassword(8) . "\n";

sub generatePassword {
$length = shift;
$possible = 'abcdefghijkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
while (length($password) < $length) {
	$password .= substr($possible, (int(rand(length($possible)))), 1);
	}
	  # return $password
  open (MINFIL, '>>passord.txt');
print MINFIL "username is: $username and password is $password \n";
close (MINFIL);
  }

$md5password = crypt $password, $salt;

# End hashes
# Now on to add the actual username
#
 print "Do you want to create $username Y/n?\n";
$_ = <STDIN>;
chomp;
$_ = "Y" if (length($_) == 0);

# Check to see if user exists.
#

# add user
if ($_ =~ /[Yy]/) {
 print "Adding user $username...\n";
 system("useradd -m -d /home/$username $username");
 system("usermod -p '$md5password' $username");
}
else {
print "error";
}

Endret av Haavard82
Lenke til kommentar

Flott! Jeg tok utgangspunkt i originalscriptet ditt for ordens skyld.

 

1) Alltid bruk:

 

use strict;
use warnings;

 

Hvis du skipper det fordi alt "bare slutter å fungere" da, har du nettopp demonstrert hvor viktig det er å ha med.

 

2) jeg pleier å forenkle chomp brukerinput med en linje:

chomp( my $username = <STDIN> );

 

3) mange før deg har tenkt gjennom passord relaterte operasjoner:

http://search.cpan.org/search?query=password&mode=module

 

Jeg synes jeg ser flere søkeresultat på første side som virker relevante for deg.

 

4) ser ut som du ønsker å vise og lagre passordet i en operasjon?

 

print my $tmpPassword = generatePassword(15);

 

Så slipper du å skrive til en global variabel fra funksjonen din. Litt ryddigere slik. Funksjonen må i tillegg defineres før den kan brukes.

 

5) Mindre viktig: hvis du bruker enkel-fnutter '', slippe du å escape $-tegnene dine: $md5password = print crypt("hahaha", '$1$j5nZfGq2');

 

6) system kall utføres med system LIST, ie: system( "useradd", $username, "-g", "users", $realname, "-p", $md5password ); ## den tar seg av usikre verdier i dine variable. Du ønsker kanskje at andre skal kunne sudo gjøre dette? kjipt om de skriver username="; rm -rf /;"

 

7) sjekk om brukeren ikke taster n:

 

chomp($_=<STDIN>);
if( lc $_ ne "n" ){
# ...
}

 

8) mer en formalitet: du trenger ikke string quotes på hash keys, $useraddcmd{useradd} # er nok

 

9) else output, mer passende med "user aborted" el. hvis brukeren trykker n eller N?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...