Russian Qt Forum
Июля 04, 2025, 23:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

Сообщений: 872


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


Просмотр профиля
« : Февраля 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

Сообщений: 872


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


Просмотр профиля
« Ответ #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

Сообщений: 872


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


Просмотр профиля
« Ответ #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

Сообщений: 872


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


Просмотр профиля
« Ответ #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

Сообщений: 872


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


Просмотр профиля
« Ответ #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

Сообщений: 197


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

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

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


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