Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Скрытие набираемого пароля в консоли


Автор: JackYF 5.7.2007, 00:21
Возникла следующая проблема.
Консольная программа использует аутентификацию имя-пароль.

Соответственно юзер на приглашение вводит имя, затем пароль. Но логично, что набираемый пароль не должен отображаться на экране. Либо вообще в принципе (как сделано при процедуре логина в терминальной сессии Linux), либо хотя бы заменяться звездочками, как во многих других реализациях.

Шаманства с getchar() прекрасно подошли для Винды, но в Линухе не хочет работать:

Делал так:
Код

void read_password( std::string& password )
   {
      password.clear();
      char ch = 0;
      while ( (std::cin.sync(), ch = getchar()) != '\n' )
      {
         password += ch;
      }
      std::cout << std::endl;
   }

то тогда консоль дальше работает нормально, но пароль выводится на консоль

Где я неправ?

Автор: MAKCim 5.7.2007, 10:55
JackYF
Код

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

static int read_password(char *buf, int length) {
    struct termios termios;
    tcgetattr(STDIN_FILENO, &termios);
    termios.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &termios);
    return read(STDIN_FILENO, buf, length);
}

static char buf[256];

int main() {
    read_password(buf, 256);
    return 0;
}

см. man tcsetattr

Автор: JackYF 5.7.2007, 11:25
MAKCim, огромное спасибо за идею. Держи плюс.

Правда, этот пример пришлось довести до рабочего, а то в исходном варианте консоль так и остается без эха.
Для тех, кому еще понадобится, вот готовый вариант:
Код

#include <termios.h>
#include <unistd.h>
#include <stdio.h>
static int read_password(char *buf, int length)
{
    struct termios termios;
    tcgetattr(STDIN_FILENO, &termios);
    termios.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &termios);
    int res = read(STDIN_FILENO, buf, length);
    termios.c_lflag |= ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &termios);
    return res;
}
static char buf[256];
int main()
{
    printf("\nShow me a password: ");
    fflush(stdout);
    read_password(buf, 256);
    printf("\nWritten password: %s\n", buf);
    return 0;
}



Добавлено через 9 минут и 13 секунд
забыл закрыть тему. Закрываю....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)