回 帖 发 新 帖 刷新版面

主题:在LINUX系统下有没有getpass的替代函数

在UNIX系统下我运行一个程序可以使用getpass接收输入口令(在屏幕上不显示)加密,但到LINUX下此函数不能用了,请各位高手专家指点:在LINUX下有替代getpass的函数吗?谢谢![code=c]
请填写代码
[/code]

回复列表 (共5个回复)

沙发


替代不成吧。









SIGNATURE:----------------------------------------
An hour in the morning is worth two in the evening.
[url=http://www.cheapfrees.com/men-nike-free-run-2-shoes-c-28.html]nike free run 2[/url],[url=http://www.cheapfrees.com/men-nike-free-30-shoes-c-22.html]nike free 3.0[/url],[url=http://www.cheapfrees.com/men-nike-free-70-shoes-c-26.html]nike free 7.0[/url]

板凳

怎么就没有高人说明?
难道真的没有解决问题的办法了?

3 楼

#include <stdio.h>
#include <conio.h>
#include <ctype.h>


#define K_ENTER  0x0d                   //  回车键
#define K_DEL    0x08                   //  删除键
#define K_ESC    0x1b                   //  ESC 键

#define PASSWORD_MASK    ('*')          // 输入密码时显示的字符
#define PASSWORD_SIZE    (16)           //     密码最大长度
#define IS_PASSWORD(ch)                 \
          (isalnum(ch) || ispunct(ch))  // 密码字符:字母 数字 标点 


const char *
foo (const char * inform)
{
  int ch,  i;
  static char buf[ PASSWORD_SIZE+1 ];

  if (inform != NULL)
    printf (inform);

  
    i = 0;

REPEAT:
    
    ch = getch ();

    if (ch==K_ENTER)                  // 回车键,表示密码输入完成
      goto FINSHED;

    if (IS_PASSWORD(ch) && i<PASSWORD_SIZE)
      {                               // 合法密码字符
        buf[i++] = (char)ch;
        putchar (PASSWORD_MASK);
      goto REPEAT;
      }
   
    if (ch==0x00 || ch==0xe0)         // F1~F12等 Ctrl+? Alt+?
      {                               // Up Down Left Rihgt Home End等
        getch ();
      goto REPEAT;
      }

   if (ch==K_ESC)                     // Esc键,清空当前输入
     {
       for (; i>0; --i)
         printf("\b \b");
       i = 0;
     goto REPEAT;
     } 

    if (ch==K_DEL  &&  i>0)          // 删除键,回车上面的那个,不是Delete键
      {                              // 如果还有可以删除的字符,那就删除
        --i;
        printf ("\b \b");
      }

    goto REPEAT;




FINSHED:

  buf[i] = '\0';
  
  return  i<PASSWORD_SIZE  && i>0
     ?    (const char *) buf
     :    (const char *) NULL;           
    // 如果输入长度大于PASSWORD_SIZE 或者 没有合法输入 则返回空指针

}





int main (void)
{
  const char * p;

  do{
      p = foo ( "input password(0< len <16): " );
      if (p)
        puts (p);
    }
  while (p);

  return 0;
}


功能和getpass差不多

4 楼

谢谢!
只是楼上给出的程序不是LINUX下的!

5 楼

不好意思,我不知道linux下没有getch.
这个是在网上找的
/* Copyright (C) 1992,93,94,95,96,97,98,99,2000, 2001 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License along
   with this program; if not, write to the Free Software Foundation,
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#if HAVE_CONFIG_H
# include <config.h>
#endif

#include <stdio.h>
#ifndef SEEK_CUR
#define SEEK_CUR 1
#endif
#include <termios.h>
#include <unistd.h>
#include "getline.h"

/* It is desirable to use this bit on systems that have it.
   The only bit of terminal state we want to twiddle is echoing, which is
   done in software; there is no need to change the state of the terminal
   hardware.  */

#ifndef TCSASOFT
# define TCSASOFT 0
#endif

char *
getpass (const char *prompt)
{
  FILE *in, *out;
  struct termios s, t;
  int tty_changed;
  static char *buf;
  static size_t bufsize;
  ssize_t nread;

  /* Try to write to and read from the terminal if we can.
     If we can't open the terminal, use stderr and stdin.  */

  in = fopen ("/dev/tty", "w+");
  if (in == NULL)
    {
      in = stdin;
      out = stderr;
    }
  else
    out = in;

  /* Turn echoing off if it is on now.  */

  if (tcgetattr (fileno (in), &t) == 0)
    {
      /* Save the old one. */
      s = t;
      /* Tricky, tricky. */
      t.c_lflag &= ~(ECHO|ISIG);
      tty_changed = (tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &t) == 0);
    }
  else
    tty_changed = 0;

  /* Write the prompt.  */
  fputs (prompt, out);
  fflush (out);

  /* Read the password.  */
  nread = getline (&buf, &bufsize, in);
  if (buf != NULL)
    {
      if (nread < 0)
    buf[0] = '\0';
      else if (buf[nread - 1] == '\n')
    {
      /* Remove the newline.  */
      buf[nread - 1] = '\0';
      if (tty_changed)
        {
          /* Write the newline that was not echoed.  */
          if (out == in) fseek (out, 0, SEEK_CUR);
          putc ('\n', out);
        }
    }
    }

  /* Restore the original setting.  */
  if (tty_changed)
    (void) tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &s);

  if (in != stdin)
    /* We opened the terminal; now close it.  */
    fclose (in);

  return buf;
}

--------------------------------------------------------------------------------

我来回复

您尚未登录,请登录后再回复。点此登录或注册