2013-03-13 81 views
0

我在Perl中沒有超級技能。但是,我這樣做了兩個用戶更改LDAP密碼的腳本。使用Expect模塊更改ldap密碼

第一個腳本:

#!/usr/bin/perl -w 
use strict; 
use Expect; 

my $user= getpwuid($<); 
print "Enter your old password :" ; 
my $oldpassword = <STDIN>; 
chomp($oldpassword); 

print "Enter you new password :"; 
my $newpassword = <STDIN>; 
chomp($newpassword); 

print "Running ' passwd ${user}'\n"; 
my $exp = Expect->spawn("passwd") or die "Can t acces to passwd \n"; 
unless ($exp->expect(1, "Enter login\(LDAP\) password:")) {} ; 
print $exp "${oldpassword}\r" ; 
unless ($exp->expect(1, "New password:")) {} ; 
print $exp "${newpassword}\r" ; 
unless ($exp->expect(1, "Re-enter new password:")) {} ; 
print $exp "${newpassword}\r" ; 
$exp->soft_close(); 

第二個腳本:

#!/usr/bin/perl -w 
use strict; 
use Expect; 

my $user= getpwuid($<); 
print "Enter your old password :" ; 
my $oldpassword = <STDIN>; 
chomp($oldpassword); 

print "Enter your new password :"; 
my $newpassword = <STDIN>; 
chomp($newpassword); 

print "Running ' passwd ${user}'\n"; 
my $spawn_ok; 
my $exp = Expect->spawn("passwd") or die "Can t acces to passwd \n"; 
$exp->expect(1, 
    [qr 'Enter login\(LDAP\) password:' , 
     sub { 
      $spawn_ok = 1; 
      my $fh = shift; 
      $fh->send("${oldpassword}\n"); 
      print "sent '${oldpassword}'\n"; 
      exp_continue; 
     } 
    ], 
    [eof => 
     sub { 
      if ($spawn_ok) { 
       die "ERROR: premature EOF in login.\n"; 
      } else { 
       die "ERROR: could not spawn old password.\n"; 
      } 
       } 
     ], 
    ['New password: ' , 
     sub { 
      my $fh =shift ; 
      $fh->send("${newpassword}\n"); 
      print "sent '${newpassword}'\n"; 
      exp_continue; 
     } 
    ], 
    ['Re-enter new password:' , 
     sub { 
      my $fh =shift ; 
      $fh->send("${newpassword}\n"); 
      print "sent '${newpassword}'\n"; 
      exp_continue; 
     } 
    ] 

); 

我不知道什麼是他們之間的更好。但他們工作。

其實我的腳本工作相同,如果舊密碼錯誤。我希望在腳本繼續之前控制舊密碼,或者如果舊密碼錯誤,腳本可能會重新啓動。我想過一個循環,我試圖說的是沒有成功的展臺腳本。 我能幫上忙嗎?

回答

0

您是否瞭解Net :: Ldap模塊?

http://search.cpan.org/~gbarr/perl-ldap/lib/Net/LDAP/FAQ.pod#Ho_do_I_reset_a_user%27s_password_ ...

沒有錯誤檢查!

use Net::LDAP; 

    my $ldap = Net::LDAP->new('ldaps://server.domain') or die "[email protected]"; 
    my $mesg = $ldap->bind('cn=Joe User,dc=perl,dc=ldap,dc=org', 
         password => 'oldPW'); 

    my $rootdse = $ldap->root_dse(); 

    if ($rootdse->supported_extension('1.3.6.1.4.1.4203.1.11.1') { 

     require Net::LDAP::Extension::SetPassword; 

     $mesg = $ldap->set_password(user => 'cn=Joe User,dc=perl,dc=ldap,dc=org', 
            oldpasswd => 'oldPW', 
            newpasswd => 'newPW'); 
    } 
    else { 
     $mesg = $ldap->modify('cn=Joe User,dc=perl,dc=ldap,dc=org', 
          changes => [ 
           delete => [ userPassword => $oldPW ] 
           add => [ userPassword => $newPW ] ]); 
    } 

    $ldap->unbind(); 
+0

謝謝,但我的LDAP是OpenDS ...我想對密碼應用一些限制。這個事實推到了passwd命令..... – dubis 2013-03-13 13:30:36