アプリケーションは を読み取ることができる必要がありました/etc/shadow
。
これを行う 1 つの方法については、私の投稿を参照してください。
編集:リンクが壊れた場合に備えて、上記のリンクから投稿を追加します
Linux で PAM を介してユーザー名/パスワードをチェックできる認証モジュールを C++ で作成しました (私は Fedora Linux を使用しています)。私が作ったものをあなたと共有したいと思います:-)。じゃ、行こう :-)
前提条件:
Install package pam-devel
(This step is necessary when you use shadow password) Create new Linux user and group. Set this group as default for this user. Then
/etc に移動します root としてログインします (su) ファイル シャドウのグループを新しいグループに変更します (chgrp new_group shadow) このグループに「読み取り」特権を設定します (chmod 0440 shadow)
次のコードを書きます: (authModule.c) view plaincopy to clipboardprint?
#include <stdio.h>
#include <security/pam_appl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
struct pam_response *reply;
// //function used to get user input
int function_conversation(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr)
{
*resp = reply;
return 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; // this gets set by pam_start
int retval;
retval = pam_start("su", username, &local_conversation, &local_auth_handle);
if (retval != PAM_SUCCESS)
{
printf("pam_start returned: %d\n ", retval);
return 0;
}
reply = (struct pam_response *)malloc(sizeof(struct pam_response));
reply[0].resp = strdup(password);
reply[0].resp_retcode = 0;
retval = pam_authenticate(local_auth_handle, 0);
if (retval != PAM_SUCCESS)
{
if (retval == PAM_AUTH_ERR)
{
printf("Authentication failure.\n");
}
else
{
printf("pam_authenticate returned %d\n", retval);
}
return 0;
}
printf("Authenticated.\n");
retval = pam_end(local_auth_handle, retval);
if (retval != PAM_SUCCESS)
{
printf("pam_end returned\n");
return 0;
}
return 1;
}
int main(int argc, char** argv)
{
char* login;
char* password;
printf("Authentication module\n");
if (argc != 3)
{
printf("Invalid count of arguments %d.\n", argc);
printf("./authModule <username> <password>");
return 1;
}
login = argv[1];
password = argv[2];
if (authenticate_system(login, password) == 1)
{
printf("Authenticate with %s - %s through system\n", login, password);
return 0;
}
printf("Authentication failed!\n");
return 1;
}
コンパイル コード:
gcc -o authModule authModule.c -lpam
コードを実行します (新しいユーザーとして!):
./authModule user password
それで全部です!!:-) それが役に立てば幸い!