C 使用getpass()后,我无法再在linux命令提示符中键入。它记录了我的击键,但没有回音 信号(信号处理器、处理器); 警报(5); passphrase=getpass(“输入passphrase:”); 报警(0); 出口(0); 无效处理程序(int sig) { if(sig==SIGALRM) printf(“\n”); 出口(0); }
这是我的代码片段。它在5秒后超时,打印timeout,下一个命令提示符显示$,但它不再是我键入的echo。然而,它正在记录它,如果输入正确,我仍然可以执行命令,毫无疑问,这是修改终端设置以不回显密码,并且如果允许回显完成,它无疑也会打开回显 但是,由于您在这一点之前中断了它,您可能必须自己恢复设置,使用类似的方法 作为示例,请参见以下程序:C 使用getpass()后,我无法再在linux命令提示符中键入。它记录了我的击键,但没有回音 信号(信号处理器、处理器); 警报(5); passphrase=getpass(“输入passphrase:”); 报警(0); 出口(0); 无效处理程序(int sig) { if(sig==SIGALRM) printf(“\n”); 出口(0); },c,linux,signals,echo,alarm,C,Linux,Signals,Echo,Alarm,这是我的代码片段。它在5秒后超时,打印timeout,下一个命令提示符显示$,但它不再是我键入的echo。然而,它正在记录它,如果输入正确,我仍然可以执行命令,毫无疑问,这是修改终端设置以不回显密码,并且如果允许回显完成,它无疑也会打开回显 但是,由于您在这一点之前中断了它,您可能必须自己恢复设置,使用类似的方法 作为示例,请参见以下程序: signal(SIGALRM, handler); alarm(5); passphrase = getpass("Enter Passphra
signal(SIGALRM, handler);
alarm(5);
passphrase = getpass("Enter Passphrase:");
alarm(0);
exit(0);
void handler(int sig)
{
if(sig == SIGALRM)
printf("<Time Out> \n");
exit(0);
}
#包括
#包括
#包括
#包括
#包括
//用于保存终端状态。
静态结构术语;
静态无效处理程序(int sig){
//通知用户,重置术语状态并退出。
printf(“\n”);
tcsetattr(0、TCSANOW和tio);
出口(0);
}
内部主(空){
字符*密码短语;
//可能保存终端设置
//需要更好的错误处理:-)
如果(tcgetattr(0,&tio)!=0){
printf(“urk!\n”);
}
//启动计时器,尝试获取输入。
信号机(信号机、处理器);
警报(5);
passphrase=getpass(“输入passphrase:”);
报警(0);
//打印并完成。
printf(“您输入了“%s”\n”,密码短语);
返回0;
}
1它在Linux中被标记为过时,并在不久前从POSIX中删除。如果您想知道在
getpass()
之前使用什么,答案在上面的代码中。使用tcsetattr()
和ECHO
选项(请记住,您的信号处理程序在退出时仍应恢复)。并不能真正解决您的实际问题,但如果您运行reset
,您可能会再次看到您键入的内容。运行stty ECHO
或stty sane
是一个快速修复方法。但是,Prolly不应该使用getpass()
(请参阅手册页中的警告)。在C中,您可以使用tcsetattr(3)
和ECHO
来控制回声。这就是stty(1)(和getpass()
,尽管它也做其他事情)在引擎盖下使用的功能。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <termios.h>
#include <unistd.h>
// For saving terminal status.
static struct termios tio;
static void handler (int sig) {
// Notify user, reset term status and exit.
printf("<Time Out>\n");
tcsetattr(0, TCSANOW, &tio);
exit (0);
}
int main (void) {
char *passphrase;
// Save terminal setting, probably
// need better error handling :-)
if (tcgetattr(0, &tio) != 0) {
printf ("urk!\n");
}
// Start timer, try to get input.
signal (SIGALRM, handler);
alarm (5);
passphrase = getpass ("Enter Passphrase: ");
alarm (0);
// Print it and finish up.
printf ("You entered '%s'\n", passphrase);
return 0;
}