主题:在LINUX系统下有没有getpass的替代函数
grisys
[专家分:50] 发布于 2011-07-31 17:31:00
在UNIX系统下我运行一个程序可以使用getpass接收输入口令(在屏幕上不显示)加密,但到LINUX下此函数不能用了,请各位高手专家指点:在LINUX下有替代getpass的函数吗?谢谢![code=c]
请填写代码
[/code]
回复列表 (共5个回复)
沙发
lijiaoyand [专家分:50] 发布于 2011-08-01 21:38:00
替代不成吧。
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]
板凳
grisys [专家分:50] 发布于 2011-09-01 09:04:00
怎么就没有高人说明?
难道真的没有解决问题的办法了?
3 楼
windy0will [专家分:2300] 发布于 2011-09-01 20:43:00
#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 楼
grisys [专家分:50] 发布于 2011-09-08 10:41:00
谢谢!
只是楼上给出的程序不是LINUX下的!
5 楼
windy0will [专家分:2300] 发布于 2011-09-08 20:08:00
不好意思,我不知道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;
}
--------------------------------------------------------------------------------
我来回复