unix에서 password변경하는 함수 만들기.

이소희의 이미지

패스워드를 변경하기 위해서 함수를 만들어 내부에서

popen("passwd unsername","r"); 함수를 호출하면

아래 메시지가 출력되고 커서가 깜박입니다.

New password:

결국 수동으로 암호를 넣으면

Re-enter new password:

메시지가 출력되고 암호를 타이핑해서 확인해야 합니다.

파라미터로 '사용자계정'과 '암호'를 받아

수동으로 타이핑하지 않고 자동으로 해당 계정에 대한 암호를 변경하기 함수를 만들려면

어떻게 해야 하는지요?

조언 부탁드립니다.^^;

mrjh76의 이미지

예전에 패스워드가 맞는지 확인하기 위해 작성한 코드인데,,, 패스워드 변경에 참조하셔도 좋을듯 합니다!

#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;
}
ymir의 이미지

단순히 암호 변경이 목적이고, 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 』

chunsj의 이미지

PAM과 NSS를 이용하는 것이 더 좋지 않을까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.