gpt4 book ai didi

linux - 使用 Expect 模块更改 ldap 密码

转载 作者:太空宇宙 更新时间:2023-11-04 04:17:49 25 4
gpt4 key购买 nike

我在 Perl 方面没有超强的技能。但是,我执行了这两个脚本来更改用户的 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;
}
]

);

我不知道他们之间哪个更好。但它们确实有效。

实际上,如果旧密码错误,我的脚本也能正常工作。我想在脚本继续之前控制旧密码,或者如果旧密码错误,脚本可能会重新启动。我考虑了一个循环,我尝试放入展位脚本但没有成功。我可以帮忙吗?

最佳答案

您了解 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 "$@";
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();

关于linux - 使用 Expect 模块更改 ldap 密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com