[완료]getpass 함수에 대해서 질문을 드리겠습니다.

anaud2의 이미지

안녕하세요
정말 특이한 현상을 접해서 질문을 드립니다.; 아직 이유를 모르겠네요
char *getpass( const char * prompt );
를 사용하려구 합니다.
이유는 패스워드르르 받을때 scanf로 한다면 숫자가 그대로 보이기때문에 바꾸려구 하고 있습니다. getpass함수를 사용하고 실행을시켰을때 아래와 같습니다.

 /*결과*/
Input: /*123456 입력*/
PC[6] passcode[123456]
IO[6] IO[123456]
Authentication failure [1003]
 Input: /*123 입력  <-3회입력(백스페이스) 456입력
PC[9] passcode[456]
IO[9] IO[456]
Authentication failure [1003]
 Input: /*123 입력 <-6회입력(백스페이스) 456입력
PC[12] passco456]23
IO[12] 456]23
User lock up(Error number of times excess) [1004]
/*소스*/
int MRCheck(char *pUserID, char *pShell)
{
    MRCONF mrconf;
    int out=0;
    int round=0;
    int sincValue=0;
    char replyMSG[259+1]="\0";
    char Passcode[47+1]="\0";
    char PrePC[16+1]="\0";
    char *IO = NULL;
    memset(&mrconf, 0x00, sizeof(mrconf));
    /*char sh[] = "/bin/ksh";나중에 리플라이 메세지로 쉘을 파싱을 하면 사용을 안할부분*/
 
 
    out = MRConfRead(&mrconf);
    if(out == FAIL)
    {
        printf("File read failure [/etc/MRserver.txt, MRConf.rec]\n");
        return FAIL;
    }
 
    for(;round < mrconf.Retry; round++)
    {
        /*printf(" Input: ");
        memset(Passcode, 0x00, sizeof(Passcode));
        scanf("%s",Passcode); 수정11월20일 passcode input을 getpass로 수정*/
 
        IO = getpass(" Input: ");
        memset(Passcode, 0x00, sizeof(Passcode));
        strcpy(Passcode, IO);
        printf("PC[%d] passcode[%s]\n",strlen(Passcode), Passcode);
        printf("IO[%d] IO[%s]\n",strlen(IO), IO);

문제가 되는 함수의 소스부분과 결과 부분입니다.
이상하게 비밀번호를 잘못 입력을했을때 지우는 백스페이스가 지워지는게 아니라 그대로 문자열로 남아서 pritnf에서 출력이 되는거 같습니다
소스 마지막에서 보듯이 printf()에서는 입력된 문자열과 길이를 출력시키고 있는데 출력화면에서 2번째와 3번째 길이를 보면 백스페이스 길이까지 사이즈로 출력이 되고 있습니다. 또한 3번째를 보면 printf에서 %s 이전의 문자열까지 백스페이스 입력한 길이만큼 지워지는 기이한 현상을 보이고 있습니다.

getpass의 문제인가 해서 다른 테스트 페이지에서 위의 소스중 getpass에 관련된 부분만 편집해서 실행해봤습니다.

/*출력*/
OTP Input: /*123456 입력*/
PC[6] passcode[123456]
OTP Input: /*123 입력  <-3회입력(백스페이스) 456입력
PC[3] passcode[456]
OTP Input: /*123 입력 <-6회입력(백스페이스) 456입력
PC[3] passcode[456]
/*소스*/
#include <unistd.h>
#include <stdio.h>
 
int main(void)
{    
    int i=0;
    char Passcode[47+1]="\0";
    char *IO = NULL;
    for(i=0;i<3;i++)
    {
        IO = getpass(" Input: ");
        memset(Passcode, 0x00, sizeof(Passcode));
        strcpy(Passcode, IO);
        printf("PC[%d] passcode[%s]\n",strlen(Passcode), Passcode);
    }
}

이해가 안되는 결정적인 부분이 이부분입니다. 문제가 되는 소스에서 getpass에 관련된 부분만 따로 편집해서 출력을 시켰을때는 멀쩡하게 돌아가는데 왜 위의 소스는 문제가 생길까요
또한 char * getpass는 포인터를 리턴해서 char []로는 받을수 없던데 방법이 있을까요 strcpy로 카피하는것 때문에 위와 같은 문제가 발생될까해서요..
도저히 알수가 없어서 질문을 드립니다.

IsExist의 이미지

man 페이지에는 이 함수를 더이상 사용하지 말라고 나옵니다.

stty erase 값에 따라 달라질겁니다.
컴맨드 상에서 stty -a 을 실행하고 erase 로 셋팅된 값과 백스페이스 값이
같은지 확인 해 보세요.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

anaud2의 이미지

RHL4:anaud2:/home/anaud2/login/data> stty -a
speed 9600 baud; rows 47; columns 109; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

인터넷을 보니까 ^H 는 백스페이스라고 나와있던데...정상적으로 설정 되어 있는것 아닌가요?

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.