unix에서 password변경하는 함수 만들기.
글쓴이: 이소희 / 작성시간: 수, 2009/01/21 - 11:49오전
패스워드를 변경하기 위해서 함수를 만들어 내부에서
popen("passwd unsername","r"); 함수를 호출하면
아래 메시지가 출력되고 커서가 깜박입니다.
New password:
결국 수동으로 암호를 넣으면
또
Re-enter new password:
메시지가 출력되고 암호를 타이핑해서 확인해야 합니다.
파라미터로 '사용자계정'과 '암호'를 받아
수동으로 타이핑하지 않고 자동으로 해당 계정에 대한 암호를 변경하기 함수를 만들려면
어떻게 해야 하는지요?
조언 부탁드립니다.^^;
Forums:


예전에 패스워드가
예전에 패스워드가 맞는지 확인하기 위해 작성한 코드인데,,, 패스워드 변경에 참조하셔도 좋을듯 합니다!
#include < stdio.h> #include < stdlib.h> #include < unistd.h> #include < pwd.h> #include < shadow.h> int main(int argc, char *argv[]) { struct spwd *shadow; struct passwd *ppasswd; char *password; int auth; if ( argc < 3 ) { printf("\nUsage: passauth USER PASS\n\n"); exit(1); } if ( NULL == (ppasswd=getpwnam(argv[1])) ) { printf("\nUser not exist.\n\n"); exit(1); } // password=getpass(" Enter Password: "); password=argv[2]; if ( ! strcmp( ppasswd->pw_passwd, "x" ) ) { shadow=getspnam(argv[1]); if ( strcmp( shadow->sp_pwdp, (char *)crypt(password, shadow->sp_pwdp)) ) auth=1; else auth=0; } else { if ( strcmp( ppasswd->pw_passwd, (char *)crypt(password, ppasswd->pw_passwd)) ) auth=1; else auth=0; } /* if ( auth == 0 ) { printf("home directory : %s\n", ppasswd->pw_dir); printf("shell program : %s\n", ppasswd->pw_shell); if ( strcmp( ppasswd->pw_passwd, "x" ) ) printf("encrypted passwd : %s\n", ppasswd->pw_passwd); else printf("encrypted passwd : %s\n", shadow->sp_pwdp); } */ return auth; }음...
단순히 암호 변경이 목적이고, shadow password 를 지원하는 환경이라면..
#define DAY (24L * 60 * 60) /* 1 day in seconds */ #define DAY_NOW (time_t)time((time_t *)0) / DAY struct spwd *spwd = NULL; lckpwdf(); fp = fopen("/etc/shadow.temp", "w"); setspent(); while ((swpd = getspent()) != NULL) { if (!strcmp(spwd->sp_namp, username) { spwd->sp_pwdp = crypted_passwd; spwd->sp_lstchg = DAY_NOW; } putspent(spwd, fp); } endspent(); fclose(fp); rename("/etc/shadow", "/etc/shadow.old"); rename("/etc/shadow.temp", "/etc/shadow"); chown("/etc/shadow", 0, 0); chmod("/etc/shadow", S_IRUSR); ulckpwdf();정도의 순서로 작성하시면 될 것 같습니다.
shadow.h 를 참조하시고, 그 외의 함수 헤더 및 에러, 예외 처리는 적당히... ;;
DAY_NOW 는 linux 의 shadow.h 에는 없어서.. 추가했습니다...
기존의 암호화 된 password 의 salt 값에 따라..
crypt 또는 md5 crypt 를 적절히 선택하시면 되고..
그냥 crypt 로 밀어붙여도 됩니다.. 아마도.. ;;;
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
PAM과 NSS를 이용하는
PAM과 NSS를 이용하는 것이 더 좋지 않을까요?
댓글 달기