Russian Qt Forum
Май 02, 2024, 08:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Ввод пароля в консоли  (Прочитано 12593 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« : Февраль 19, 2014, 10:11 »

Коллеги, есть ли стандартные средства для подавления эха (или замены вводимых символов на какой-либо один) при вводе строки в консольном приложении? Нужно для ввода пароля.
« Последнее редактирование: Февраль 19, 2014, 21:15 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #1 : Февраль 19, 2014, 11:10 »

Я не совсем понял вопроса. В консоли же символы не заменяемые вроде.

Записан
OKTA
Гость
« Ответ #2 : Февраль 19, 2014, 11:16 »

В liunx можно с использованием ф-ий самой консоли, на сколько знаю.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #3 : Февраль 19, 2014, 12:17 »

Я не совсем понял вопроса. В консоли же символы не заменяемые вроде.
Я не понял ответа Улыбающийся Т.е. спрятать вывод можно только затерев его другими символами?
А хотелось примерно так, как в QLineEdit c QLineEdit::NoEcho или QLineEdit::Password.

В liunx можно с использованием ф-ий самой консоли, на сколько знаю.
Хочется средствами Qt - программа работает в разных ОС.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
OKTA
Гость
« Ответ #4 : Февраль 19, 2014, 12:26 »

Думаю универсального решения не будет. Поток ввода связан уже не с самой программой, а с конкретной ОС, на сколько я понимаю.
Записан
Bepec
Гость
« Ответ #5 : Февраль 19, 2014, 12:45 »

Таки да, тут уже консоль нужно терзать. Можно затирать символ сразу после введения как вариант. Хотя тут тоже тонкости есть )
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Февраль 19, 2014, 12:57 »

Думаю универсального решения не будет. Поток ввода связан уже не с самой программой, а с конкретной ОС, на сколько я понимаю.
Осознал. Что же, остается только printf("\r")?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
OKTA
Гость
« Ответ #7 : Февраль 19, 2014, 13:02 »

Работает однако)
Код:
#include <stdio.h>
#include <conio.h>
int main(int argc, char *argv[])
{
        char x[10];

        printf("enter password\n");

        for(int i=0; i<9;i++){
            x[i]=getch();
            printf("*");

            if(x[i]=='\r') {
                //

                x[i+1] = '\0';
                break;
            }
        }
        x[10] = '\0';
        printf("\nthe password is : %s", x);


    return 0;
}
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #8 : Февраль 19, 2014, 13:26 »

Тогда лучше так:

Код:
#include <stdio.h>
#include <conio.h>
int main(int argc, char *argv[])
{
        char x[10];

        printf("enter password\n");

        for(int i=0; i<9;i++){
            x[i]=getch();

            if(x[i]=='\r') {
                //

                x[i+1] = '\0';
                break;
            }
            else
                printf("*");
        }
        x[10] = '\0';
        printf("\nthe password is : %s", x);


    return 0;
}
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #9 : Февраль 19, 2014, 13:36 »

Этот вариант я уже рассматривал. Попробуйте теперь при вводе backspace, esc и т.д. Чтобы их обработать, нужно курсор двигать назад, а это проблема.
Пока виден один вариант - printf("\r"), т.е. полное подавление эха.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Февраль 19, 2014, 13:43 »

через нативную консоль, в винде типа того - http://www.cplusplus.com/forum/unices/27735/ . В Linux - getpass()
Записан
Bepec
Гость
« Ответ #11 : Февраль 19, 2014, 13:50 »

А в линуксе проще - там что угодно вводи, отображаться правда не будет Веселый
Записан
OKTA
Гость
« Ответ #12 : Февраль 19, 2014, 13:57 »

Полное подавление эхо тоже хорошо  Улыбающийся
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #13 : Февраль 19, 2014, 21:17 »

Итак, коллеги, попробую подвести итоги. Не уверен, что это относится к Qt, но надеюсь, модератор меня не заплюсует.
1. Сделать ввод пароля с отображением маскирующих символов в консоли не получится. Точнее, не получится, если при вводе использовать управляющие символы. Напрример, клавиша bakspace или delete испортит всю картину.
2. Способы сокрытия вводимой информации из командной строки можно разделить на два вида.

Первый способ - выводить поверх эха какие-нибудь символы, например, пробелы. Это обеспечивается перемещением текстового курсора в консоли назад и вывода маскирующего символа.
С управлением положением курсором в консоли обстоит дело не лучше. Если в windows эту проблему можно как-то решить, то в linux вряд ли. Поэтому более или менее приемлемым вариантом остается вывод в стандартный поток символов возврата каретки \r или backspace \b.

Второй способ - подавление эхо-вывода. Т.е. перевод консоли в такой режим, при котором курсор стоит на месте, а в консоль ничего не печатается.

Оба способа платформо-зависимые.
Например, для того, чтобы после ввода каждого символа вернуть каретку назад, нужно использовать небуферизованный ввод с посимвольным чтением. В windows это сделать легко нестандартной функцией getch() из conio.h.
В linux ввод построчный. Т.е. функция getchar() читает стандартный ввод до тех пор, пока не будет нажата клавиша возврата каретки. Но можно перевести консоль в посимвольный режим ввода. Решение я увидел у Nixman: http://www.cyberforum.ru/cpp-linux/thread162276.html#post931906.

Второй способ, на мой взгляд, проще, а потому красивее. Определяются две функции echo(bool) для windows и linux, управляющие включением/выключением эха: http://www.cplusplus.com/forum/general/12256/. Далее ввод пароля делается просто:
Код:
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTextStream in(stdin), out(stdout);
    out << "Enter password:" << endl;

    echo(false);
    QString str=in.readLine();
    echo(true);

    out << endl << "Password: " << str << endl;
    return 0;
}
Я лично буду использовать второй.
Если не последует возражений, то тему закрою.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #14 : Декабрь 26, 2017, 15:38 »

Спасибо!
Второй способ и вправду выглядит изящным.
А как с макосью? там, скорее всего, будет аналогично линуксу?
Записан

Мои проекты на Qt: DoubleContact, LInvert
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.065 секунд. Запросов: 23.