C 使用getpass()后,我无法再在linux命令提示符中键入。它记录了我的击键,但没有回音 信号(信号处理器、处理器); 警报(5); passphrase=getpass(“输入passphrase:”); 报警(0); 出口(0); 无效处理程序(int sig) { if(sig==SIGALRM) printf(“\n”); 出口(0); }

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

这是我的代码片段。它在5秒后超时,打印timeout,下一个命令提示符显示$,但它不再是我键入的echo。然而,它正在记录它,如果输入正确,我仍然可以执行命令,毫无疑问,这是修改终端设置以不回显密码,并且如果允许回显完成,它无疑也会打开回显

但是,由于您在这一点之前中断了它,您可能必须自己恢复设置,使用类似的方法

作为示例,请参见以下程序:

  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;
}