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]
[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]