我有用C编写的程序 . 它使用2个参数用户名/密码,并尝试使用PAM验证此用户 . 当我是root用户时它工作正常 . 当我是'普通'用户时,它适用于该用户,但不适用于另一个用户 . 我认为,这是由于使用了影子密码..
作为我正在使用的服务:
retval = pam_start("test", username, &local_conversation, &local_auth_handle);
我将它添加到/etc/pam.d/test
#%PAM-1.0
auth required pam_unix.so shadow nullok
account required pam_unix.so
session required pam_unix.so
请问你能帮帮我吗?非常感谢!
2 回答
该应用程序需要能够阅读
/etc/shadow
.有关这种方法的一种方法,请参见my post .
编辑:如果链接中断,请从上面的链接添加帖子
struct pam_response * reply;
// //用于获取用户输入的函数
int function_conversation(int num_msg,const struct pam_message ** msg,struct pam_response ** resp,void * appdata_ptr)
{
返回PAM_SUCCESS;
}
int authenticate_system(const char * username,const char * password)
{
const struct pam_conv local_conversation = {function_conversation,NULL};
pam_handle_t * local_auth_handle = NULL; //这是由pam_start设置的
int retval;
retval = pam_start(“su”,username,&local_conversation,&local_auth_handle);
if(retval!= PAM_SUCCESS)
{
printf(“pam_start返回:%d \ n”,retval);
返回0;
}
reply =(struct pam_response *)malloc(sizeof(struct pam_response));
回复[0] .resp = strdup(密码);
回复[0] .resp_retcode = 0;
retval = pam_authenticate(local_auth_handle,0);
if(retval!= PAM_SUCCESS)
{
if(retval == PAM_AUTH_ERR)
{
printf(“身份验证失败 . \ n”);
}
其他
{
printf(“pam_authenticate返回%d \ n”,retval);
}
返回0;
}
的printf( “认证\ n”);
retval = pam_end(local_auth_handle,retval);
if(retval!= PAM_SUCCESS)
{
printf(“pam_end返回\ n”);
返回0;
}
返回1;
}
int main(int argc,char ** argv)
{
char *登录;
char *密码;
printf(“身份验证模块\ n”);
if(argc!= 3)
{
printf(“参数的无效计数%d . \ n”,argc);
printf(“./ authModule <username> <password>”);
返回1;
}
login = argv [1];
password = argv [2];
if(authenticate_system(login,password)== 1)
{
printf(“使用%s进行身份验证 - %s到系统\ n”,登录,密码);
返回0;
}
printf(“身份验证失败!\ n”);
返回1;
}
编译代码:gcc -o authModule authModule.c -lpam
运行代码(作为新用户!):./ authModule用户密码
就这样!! :-) 希望能帮助到你!
由于代表太低,我还不能评论弗拉迪斯拉夫的帖子,但我不得不对他的代码说些什么 .
如果您不以root用户身份运行此代码,则会执行 ONLY . 以root身份运行它时,接受已知用户的密码 EVERY 密码 .
有谁知道如何解决这一问题?
EDIT: 要解决此问题,您应该使用
su
服务的sudo
pam服务intead与pam_start()