使用getpass()后,我无法再输入linux命令提示符。它记录了我的击键,但没有回应它们

时间:2015-04-17 02:01:29

标签: c linux signals echo alarm

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

这是我的代码片段。它在5秒后超时,它打印超时,下一个命令提示符出现$,但它不再回显我键入的内容。然而它正在记录它,如果键入正确,我仍然可以执行命令

1 个答案:

答案 0 :(得分:0)

毫无疑问getpass(顺便说一下,你不应该使用 1 )修改终端设置以不回显密码,毫无疑问也会回显回声是否允许完成。

但是,由于您在此之前中断了它,您可能需要使用tcsetattr()之类的内容自行恢复设置。

例如,请参阅以下程序:

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

1 它在Linux中被标记为过时,并且在前一段时间从POSIX中删除。如果您想知道在偏好中使用getpass()的内容,请参阅上面代码中的答案。将tcsetattr()ECHO选项一起使用(请记住,您的信号处理程序仍应在退出时恢复。)