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 솔루션도 포함하겠습니다 :-)
#!/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";
}