我有一个 perl 脚本,它从外部进程获取用户名和密码,然后使用 Vintela 进行用户身份验证。一切正常,直到有人强迫 Vintela 刷新它的缓存。缓存刷新后,Authen::PAM 模块返回代码 10,这意味着它找不到用户名。
如果我在 shell 中运行“id $username”命令然后运行脚本,那么该用户的一切都会恢复正常。或者,如果用户 SSH 进入系统,那么 Authen::PAM 可以完美运行。
在生产服务器上,用户不要通过 SSH 连接到服务器,因此在 Vintela 刷新后,用户无法再登录。在对每个用户进行身份验证之前,我不想为每个用户运行“id”命令。有没有办法强制脚本或 PAM 模块查找用户然后对其进行身份验证?
脚本 -
BEGIN {
unshift(@INC, "..", "/usr/local/staf/bin", "/usr/local/staf/lib", "C:/STAF/Bin");
}
use strict;
use PLSTAF;
require Authen::PAM;
my $GlobalUserName = <STDIN>;
my $GlobalPasswd = <STDIN>;
my $result = -1;
$GlobalPasswd = STAF::RemovePrivacyDelimiters($GlobalPasswd);
my $pamHandle = Authen::PAM->new("login", $GlobalUserName, \&conversionFunction);
$result = $pamHandle->pam_authenticate();
# force the destructor execution for PAM
$pamHandle = 0;
# When $result is 0 then user has been authenticated
if ($result == 0) {
print $result;
exit $result;
}
else {
exit $result;
}
sub conversionFunction {
my @response = ();
# PAM constants
my $pamEchoOn = Authen::PAM->PAM_PROMPT_ECHO_ON();
my $pamEchoOff = Authen::PAM->PAM_PROMPT_ECHO_OFF();
my $pamSuccess = Authen::PAM->PAM_SUCCESS();
while ( @_ ) {
my $code = shift;
my $msg = shift;
my $answer = "";
if ($code == $pamEchoOn) {
$answer = $GlobalUserName;
}
if ($code == $pamEchoOff) {
$answer = $GlobalPasswd;
}
# response is always in pairs, response code and the actual answer
push(@response, $pamSuccess, $answer);
}
push(@response, $pamSuccess);
return @response;
}