web-dev-qa-db-fra.com

Comment valider les mots de passe avec pam

J'ai un script bash qui vous demande votre mot de passe, puis vous devez le valider avec pam. J'ai installé libpam0g-dev comme je comprends, j'en ai besoin pour cela, mais comment puis-je valider le mot de passe avec pam? Et comment pam me permet-il de savoir si le mot de passe est valide ou non?

2
user364819

Pas bash, mais vous pouvez utiliser un script Perl dans votre script bash : P

Première installation libauthen-pam-Perl

Sudo apt-get install libauthen-pam-Perl

Après cela, créez un nouveau script Perl, par exemple. avec le nom foo

#!/usr/bin/env Perl
use Authen::PAM;
use POSIX qw(ttyname);

$service = "login";
$username = $ARGV[0];
$password = $ARGV[1];
$tty_name = ttyname(fileno(STDIN));

sub my_conv_func {
  my @res;
  while ( @_ ) {
      my $code = shift;
      my $msg = shift;
      my $ans = "";

      $ans = $username if ($code == PAM_Prompt_ECHO_ON() );
      $ans = $password if ($code == PAM_Prompt_ECHO_OFF() );

      Push @res, (PAM_SUCCESS(),$ans);
  }
  Push @res, PAM_SUCCESS();
  return @res;
}

ref($pamh = new Authen::PAM($service, $username, \&my_conv_func)) ||
       die "Error code $pamh during PAM init!";

$res = $pamh->pam_set_item(PAM_TTY(), $tty_name);
$res = $pamh->pam_authenticate;

if ($res == PAM_SUCCESS()) {
    printf ("%s\n","Success");
}
else {
    printf ("%s\n","Failure");
}

basé sur cette réponse avec quelques modifications


De man foo;)

NAME
   foo - password test

SYNOPSIS
   foo username password

DESCRIPTION
    coming soon

OPTIONS
    no options

Exemple:

$ Sudo ./foo foo wWeErRt    # wrong password
Failure

$ Sudo ./foo foo wWeErRtT   # correct password
Success

Dans votre script:

some code

ret=$(foo "$username" "$password")

some code
1
A.B.