Ubuntu中使用C语言的密码程序
可能重复:Ubuntu中使用C语言的密码程序,c,linux,passwords,C,Linux,Passwords,可能重复: 请给我一个在Linux中使用C语言的密码程序的解决方案 当我们输入密码的第一个字母时,应显示窗口 password:*- 而不是输入的字母 当我们输入下一个字符时,将显示窗口 password**- 最多8个字符 并验证密码 read -s -n 8 -p "password:" mypassword -s使其成为密码输入提示 -n限制字符数 -p STRING设置提示 输入的密码保存在$mypassword变量中,以供进一步使用 在linux命令行中,输入密码时通常不显示替
请给我一个在Linux中使用C语言的密码程序的解决方案 当我们输入密码的第一个字母时,应显示窗口
password:*-
而不是输入的字母
当我们输入下一个字符时,将显示窗口
password**-
最多8个字符
并验证密码
read -s -n 8 -p "password:" mypassword
-s
使其成为密码输入提示-n
限制字符数-p STRING
设置提示
输入的密码保存在$mypassword
变量中,以供进一步使用
在linux命令行中,输入密码时通常不显示替换字符,因此该命令不提供这样做的选项。尽管如此,它还是一个很好的近似于您正在寻找的内容
-s
使其成为密码输入提示-n
限制字符数-p STRING
设置提示
输入的密码保存在$mypassword
变量中,以供进一步使用
在linux命令行中,输入密码时通常不显示替换字符,因此该命令不提供这样做的选项。尽管如此,它还是一个很好的近似于您正在寻找的内容。这可能会对您有所帮助
这可能对您有所帮助 使用C功能:
/* no test */
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
static void
changeMode(bool b)
{
static struct termios cooked;
static int raw_actived = 0;
if (raw_actived == b) return;
if (b) {
struct termios raw;
tcgetattr(STDIN_FILENO, &cooked);
raw = cooked;
cfmakeraw(&raw);
tcsetattr(STDIN_FILENO, TCSANOW, &raw);
} else {
tcsetattr(STDIN_FILENO, TCSANOW, &cooked);
}
raw_actif = b;
}
static void
clean(void)
{
int c;
do
c = getchar();
while (c != '\n' && c != EOF);
}
void
askPassword(char *s, size_t n)
{
changeMode(1);
for (size_t i = 0; i < n; ++i) {
s[i] = getchar();
clean();
putchar('*');
}
changeMode(0);
}
/*无测试*/
#包括
#包括
#包括
静态空隙
转换模式(bool b)
{
静态结构术语;
静态int raw_actived=0;
if(raw_actived==b)返回;
如果(b){
结构termios raw;
tcgetattr(标准文件号和熟的);
生=熟;
cfmakeraw(&raw);
tcsetattr(标准文件号、TCSANOW和原始文件);
}否则{
tcsetattr(标准文件号、TCSANOW和熟的);
}
原始活动=b;
}
静态空隙
清洁(无效)
{
INTC;
做
c=getchar();
而(c!='\n'&&c!=EOF);
}
无效的
askPassword(字符数,大小)
{
转换模式(1);
对于(尺寸i=0;i
使用C功能:
/* no test */
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
static void
changeMode(bool b)
{
static struct termios cooked;
static int raw_actived = 0;
if (raw_actived == b) return;
if (b) {
struct termios raw;
tcgetattr(STDIN_FILENO, &cooked);
raw = cooked;
cfmakeraw(&raw);
tcsetattr(STDIN_FILENO, TCSANOW, &raw);
} else {
tcsetattr(STDIN_FILENO, TCSANOW, &cooked);
}
raw_actif = b;
}
static void
clean(void)
{
int c;
do
c = getchar();
while (c != '\n' && c != EOF);
}
void
askPassword(char *s, size_t n)
{
changeMode(1);
for (size_t i = 0; i < n; ++i) {
s[i] = getchar();
clean();
putchar('*');
}
changeMode(0);
}
/*无测试*/
#包括
#包括
#包括
静态空隙
转换模式(bool b)
{
静态结构术语;
静态int raw_actived=0;
if(raw_actived==b)返回;
如果(b){
结构termios raw;
tcgetattr(标准文件号和熟的);
生=熟;
cfmakeraw(&raw);
tcsetattr(标准文件号、TCSANOW和原始文件);
}否则{
tcsetattr(标准文件号、TCSANOW和熟的);
}
原始活动=b;
}
静态空隙
清洁(无效)
{
INTC;
做
c=getchar();
而(c!='\n'&&c!=EOF);
}
无效的
askPassword(字符数,大小)
{
转换模式(1);
对于(尺寸i=0;i
这只是一个想法,所以你可以试试看,也可以不试试
一开始,您必须将终端转换为非回声模式。这样,就不会显示用户的输入。(Termios设置)
从变量计数器开始。您创建一个循环(while),并在其中使用read函数或getchar获取每个输入。
接下来,检查输入是否正确。在终端上写“*”或什么都不写。这只是一个想法,所以你可以试试,也可以不试试 一开始,您必须将终端转换为非回声模式。这样,就不会显示用户的输入。(Termios设置) 从变量计数器开始。您创建一个循环(while),并在其中使用read函数或getchar获取每个输入。
接下来,检查输入是否正确。在终端上写“*”或什么都不写。他清楚地说明了C语言,而不是shell。但是,通过POSIX系统(“读取…”)调用仍然很有用。@LukaRamishvili:你的意思是
popen
?我看不出它在系统中有什么用处。提示?是的,你是对的,如果他想读回输入的密码,他需要打开一个管道,而不仅仅是调用(虽然使用system()调用可以实现视觉效果,但可能还不够)。他清楚地说明了C语言,而不是shell。但是,通过POSIX系统(“读取…”)调用仍然很有用。@LukaRamishvili:你的意思是popen
?我看不出它在系统中有什么用处。提示?是的,你是对的,如果他想读回输入的密码,他需要打开一个管道,而不仅仅是调用(虽然使用system()调用可以实现视觉效果,但这可能是不够的)。在这里也可以看到答案(),完全相同的问题。@Dhaneesh:这就是问题的全部要点。为什么不读一下答案呢?在这里也可以看到答案(),完全相同的问题。@Dhaneesh:这就是问题的重点。为什么不读答案呢?上一篇文章反映了这个想法。上一篇文章反映了这个想法。