시스템 로그인 테스트를 작성하는 방법은 무엇입니까?

시스템 로그인 테스트를 작성하는 방법은 무엇입니까?

bash호스트 시스템에서 로그인이 성공했는지 테스트하는 데 필요한 명령을 호출하는 Python CGI 스크립트를 작성했습니다 .

이에 대한 테스트를 어떻게 작성합니까?

예를 들어 bash호스트에 등록된 사용자에 대해 특정 사용자 이름과 비밀번호 조합을 테스트하는 스크립트를 만들 수 있습니까?

답변1

PAM을 사용하는 것이 가장 좋은 솔루션입니다. 작은 C 코드를 작성하거나 python-pam 패키지를 설치하고 python-pam 패키지와 함께 제공되는 python 스크립트를 사용할 수 있습니다. 바라보다/usr/share/doc/python-pam/examples/pamtest.py

답변2

사용자가 로그인할 수 있는지 테스트하는 올바른 방법은 실제로 해당 사용자로 로그인하는 것입니다.

그래서 CGI 스크립트를 사용하는 것이 좋습니다.expect를 실행하려면 su비밀번호를 전달하고 실행해야 하는 명령을 실행하세요. 다음은 이를 수행하는 예상 스크립트 초안입니다(경고: 확실히 테스트되지 않았으며 기대에 대한 경험이 많지 않습니다). 사용자 이름, 비밀번호 및 명령으로 바꿉니다. (저는 bob, swordfish및 을 썼습니다 somecommand.) 정확하게 인용해야 합니다.

spawn "/bin/su" "bob"
expect "Password:"
send "swordfish\r"
expect "^\\$"
send "somecommand"
expect -re "^\\$"
send "exit\r"
expect eof

명령을 실행하기 위해 레이어를 통과하고 싶지 않은 경우 su(예: 수행 중인 작업이 CGI 프로세스 자체에 의해 실행되어야 하기 때문에), 예상을 사용하여 명령을 실행 true하고 반환 상태가 0인지 확인하세요. .

또 다른 방법은폴리아크릴아미드다음을 통해 애플리케이션에서 직접Python용 PAM 바인딩.

답변3

여기에는 "C", "Python" PAM 솔루션이 인용되어 있습니다. Perl 솔루션도 포함하겠습니다 :-)

원천:http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactively?

#!/usr/bin/perl

  use Authen::PAM;
  use POSIX qw(ttyname);

  $service = "login";
  $username = "foo";
  $password = "bar";
  $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;
  print $pamh->pam_strerror($res),"\n" unless $res == PAM_SUCCESS();

답변4

루트 액세스 권한이 있고 md5 비밀번호를 사용하고 있으며 비밀번호만 비교해야 한다면 perl을 사용할 수 있습니다.암호화::비밀번호 MD5기준 치수. /etc/shadow에서 MD5 해시를 가져와서 $1$를 제거하고 나머지 $를 분할합니다. 필드 1 = 소금, 필드 2 = 암호화된 텍스트. CGI에 입력된 텍스트는 암호화된 텍스트와 비교하여 해시되며 Bob은 귀하의 삼촌입니다.

#!/usr/bin/env perl

use Crypt::PasswdMD5;

my $user                = $ARGV[0];
my $plain               = $ARGV[1];
my $check               = qx{ grep $user /etc/shadow | cut -d: -f2 };
chomp($check);
my($salt,$md5txt)       = $check =~ m/\$1\$([^\$].+)\$(.*)$/;
my $pass                = unix_md5_crypt($plain, $salt);

if ( "$check" eq "$pass" ) {
        print "OK","\n";
} else {
        print "ERR","\n";
}

관련 정보