什么也不要说,先来一个程序吧。
/*
注意要和你的系统一致redhat是这样/etc/pam.d/check_user
auth required /lib/security/pam_unix_auth.so
account required /lib/security/pam_unix_acct.so
1.如果需要出现密码弹出框还需要在添加
/etc/security/console.apps/check_user
USER=root
PROGRAM=~/check_user #这个路径就是下面编译好后的路径,不能和3中作链接的路径一样
SESSION=true
2.再对/usr/bin/consolehelper作ln
sudo ln -s consolehelper check_user
3.这样运行/usr/bin/check_user就实际在调用consolehelper,再去读取
/etc/security/console.apps/check_user里PROGRAM设定的路径
4.编译时要这样:
gcc check.c -ldl -lpam -lpam_misc -o ~/check_user
*/
#include
#include
#include
static struct pam_conv conv = {
misc_conv, //定义在pam_misc.h中, 方便你编程
NULL
};
int main(int argc, char *argv[])
{
pam_handle_t *pamh=NULL;
int retval;
const char *user="root"; //用户名设置为系统上的一个合法用户
if(argc == 2) {
user = argv[1];
}
if(argc > 2) {
fprintf(stderr, "Usage: check_user [username]\n");
exit(1);
}
retval = pam_start("check_user", user, &conv, &pamh);
/* 开始 */
if (retval == PAM_SUCCESS)
retval = pam_authenticate(pamh, 0);
/* 认证是不是该用户? 提示你输入一个密码 */
if (retval == PAM_SUCCESS)
retval = pam_acct_mgmt(pamh, 0);
/* 账号是否有效? */
if (retval == PAM_SUCCESS) {
fprintf(stdout, "Authenticated\n");
} else {
fprintf(stdout, "Not Authenticated\n");
}
if (pam_end(pamh,retval) != PAM_SUCCESS) {
/* 结束 */
pamh = NULL;
fprintf(stderr, "check_user: failed to release authenticator\n");
exit(1);
}
return ( retval == PAM_SUCCESS ? 0:1 ); /* indicate success */
}
#gcc check.c -ldl -lpam -lpam