Link to home
Start Free TrialLog in
Avatar of georgemason
georgemasonFlag for United Kingdom of Great Britain and Northern Ireland

asked on

Set user's password in Perl script?

Hi,

I writing a Perl script which will amongst other things create a load of users on a Linux server. I want to be able to have the script set the password for the new users it creates, and email those to the users (I will have an array with the email addresses in).

At the moment I'm struggling to find a way to set passwords in a Perl script - I can see why its difficult but if I can't do this, my plan is significantly less useful than I had hoped!

Any info welcomed. Thanks in advance.

George
Avatar of rockiroads
rockiroads
Flag of United States of America image

see an example here https://www.experts-exchange.com/questions/22641743/PHP-or-Perl-script-to-change-user's-password.html
system "sudo /usr/local/bin/chpasswd.sh $user $passwd";
or maybe call a shell script to set it passing in args
you can use usermod to change the password.

~Vikas
Avatar of georgemason

ASKER

@rockiroads - I've seen that before - but I'm writing the script to run on a Linux box, not as a web app - how would I apply that in my case?

@vikas - tried the following: system("usermod -p $password $reseller");  (where the two variables contain valid strings) and it doesn't error, but doesn't set the pw either
Avatar of gremwell
gremwell

I wonder perhaps you have forgotten to convert the plain text password to hash before passing it to usermod? You can use Crypt::PasswdMD5 available from CPAN for this purpose. The attached code snippet works for me, when executed as root.

The following script works for me (Ubuntu):
use Crypt::PasswdMD5 qw(unix_md5_crypt);
my @salt = ( '.', '/', 0 .. 9, 'A' .. 'Z', 'a' .. 'z' );
sub gensalt {
 my $count = shift;
 my $salt;
 for (1..$count) {
  $salt .= (@salt)[rand @salt];
 }
 return $salt;
}
$reseller = "abb2";
$password = "xyz2";
my $password_hash = unix_md5_crypt($password, gensalt(8));
system("usermod -p '$password_hash' $reseller");

Open in new window

I forgot to mention that the above code is based on the example provided by http://sial.org/howto/perl/password-crypt/ web page.
Sounds very promising - I had forgotten (i.e. didn't know I needed to) hash the pw.

I get this error - do I need to install a perl module?

"Can't locate Crypt/PasswdMD5.pm in @INC "
Yes, the module is available from CPAN archive. Try

sudo perl -MCPAN -e 'install Crypt/PasswordMD5'

For this to work your computer has to have internet access, to download modules from CPAN server. If it is the first time you use CPAN, you may get a lot of questions, in general it is safe to accept default options (just press Enter). See also http://perl.about.com/od/packagesmodules/qt/perlcpan.htm for more details.

PS. Some Linux distribution offer better way to do the same, Ubuntu and Gentoo at least, maybe other distributions too.
that sample web code is to take in user input of a userid but the password changing code should still be applicable right?

What command are you using right now to create the user?

On your linux o/s do you have the command useradd? If so then that is one way to create users and in there specify the password also.

useradd [-c comment] [-d home_dir]

    [-e expire_date] [-f inactive_time]
    [-g initial_group] [-G group[,...]]
    [-m [-k skeleton_dir] | -M] [-n] [-o] [-p passwd] [-r]
    [-s shell] [-u uid] login

More info on this can be found here http://linux.about.com/od/commands/l/blcmdl8_useradd.htm

Sorry, I have made a typo in my previous comment. The correct command is

sudo perl -MCPAN -e 'install Crypt::PasswdMD5'
ASKER CERTIFIED SOLUTION
Avatar of Adam314
Adam314

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks to you all for your suggestions. In the end the one which (a) worked and (b) was simplest was from Adam314 - so points go to him.