PDA

View Full Version : script to change passwords on multiple hosts over ssh


bsdjunkie
June 2nd, 2003, 18:01
Hopefully i typed this in right... Didnt have IO::Pty and Net::Telnet on this box, so it craps out from dependancies on this machine at work, but in theory it should all be good..... :roll:

[code:1:27e49b3899]#!/usr/bin/perl

use strict;
use Net::Telnet;
use Getopt::Long;
use IO::Pty;
use POSIX 'setsid';

use constant PROMPT => '/[%>] $/';

use constant USAGEMSG => <<USAGE;
Usage: change_passwd.pl [options] machine1, machine2, ...
Options:
--user <user> Login Name
--old <pass> Current Password
--new <pass> New Password
USAGE

my ($USER, $OLD, $NEW);
die USAGEMSG unless GetOptions('user=s' => \$USER,
'old=s' => \$OLD,
'new=s' => \$NEW);
$USER ||= ENV{LOGNAME};
$OLD or die "provide current password with --old\n";
$NEW or die "provide new password with --new\n";

change_passwd($_,$USER,$OLD,$NEW) foreach @ARGV;

sub change_passwd {
my ($host,$user,$oldpass,$newpass) = @_;
my $ssh = do cmd('ssh', "-l$user",$host)
or die "couldn't launch ssh";
my $shell = Net::Telnet->new(Fhopen => $ssh);
$shell->binmode(1);
$shell->input_log('passwd.log') if DEBUG;
$shell->errmode('return');

$shell->waitfor('/password: /');
$shell->print($oldpass);
$shell->waitfor(PROMPT) or return "host refused login: wrong password?\n";

$shell->print('passwd');
$shell->waitfor('/Old password:/') or return warn "$host: ",$shell->errmsg,"\n";

$shell->print($oldpass);
my($pre,$match) = $shell->waitfor(Match => '/Incorrect password/',
Match => '/New password:/');
$match =~ /New/ or return warn "$host: Incorrect password\n";

$shell->print($newpass);
($pre,$match) = $shell->waitfor(Match => '/Bad password/',
Match => '/Re-enter new password:/');
$match =~ /Re-enter/ or return warn "$host: new password rejected.\n";

$shell->print($newpass);
$shell->waitfor('/Password changed\./')
or return warn "$host: ",$shell-errmsg,"\n";

print "Password changed for $user on $host.\n";
}

sub do cmd {
my ($cmd,@args) = @_;
my $pty = IO::Pty->new or die "can't make Pty: $!";
defined (my $child = fork) or die "can't fork: $!";
return $pty if $child;
setsid();
my $tty = $pty->slave;
close $pty;

STDIN->fdopen($tty,"<") or die "STDIN: $!";
STDOUT->fdopen($tty,">") or die "STDOUT: $!";
STDERR->fdopen($tty, ">") or die "STDERR: $!";
close $tty;
$| = 1;
exec $cmd,@args;
die "Couldn't exec: $!";
}[/code:1:27e49b3899]

elmore
June 2nd, 2003, 18:08
sweet, Mini0n has a kewl passwd change script to run on an internal intranet site, perhaps he'd be willing to post it.

soup4you2
June 4th, 2003, 13:16
now i dont know jack about perl yet... just started reading though some docs the other day... but this script intrests me.. can you please tell me what all it is doing? and how it works.... thanks.. and if anything what all is required for it to work..