C ввод пароля командной строки

Улучшенная версия readCookie:

function readCookie( name )
{
    var cookieParts = document.cookie.split( ';' )
    ,   i           = 0
    ,   part
    ,   part_data
    ,   value
    ;

    while( part = cookieParts[ i++ ] )
    {
        part_data = part.split( '=' );

        if ( part_data.shift().replace(/\s/, '' ) === name )
        {
            value = part_data.shift();
            break;
        }

    }
    return value;
}

Это должно сломаться, как только вы найдете свое значение cookie и вернете его значение. На мой взгляд, очень элегантно с двойным расколом.

Замена на if-условии - это пробел белого цвета, чтобы убедиться, что он правильно соответствует

13
задан user397232 24 November 2009 в 01:50
поделиться

5 ответов

Если ваша система поддерживает это, getpass - это опция:

#include <unistd.h>
/* ... */
char *password = getpass("Password: ");

При вводе символов ничего не будет отображаться.

17
ответ дан 1 December 2019 в 19:15
поделиться

Если вы используете среду UNIX, что-то вроде этого может отключить ECHO в командной строке.

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

#define SIZE 100

void getPassword(char password[])
{
    static struct termios oldt, newt;
    int i = 0;
    int c;

    /*saving the old settings of STDIN_FILENO and copy settings for resetting*/
    tcgetattr( STDIN_FILENO, &oldt);
    newt = oldt;

    /*setting the approriate bit in the termios struct*/
    newt.c_lflag &= ~(ECHO);          

    /*setting the new bits*/
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);

    /*reading the password from the console*/
    while ((c = getchar())!= '\n' && c != EOF && i < SIZE){
        password[i++] = c;
    }
    password[i] = '\0';

    /*resetting our old STDIN_FILENO*/ 
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);

}


int main(void)
{
    char password[SIZE];
    printf("please enter password\n");
    getPassword(password);

    printf("Do something with the password <<%s>>\n", password);
    return 0;
}
10
ответ дан 1 December 2019 в 19:15
поделиться

Для C / commandline / linux см.:

man getch
man noecho

см. Комментарий в getch о noecho . Я никогда не пробовал это сам.

В bash, если вы используете read -s , на экране не отображается эхо:

> read -s x
<type something><enter>
> echo $x
<whatever you typed>
2
ответ дан 1 December 2019 в 19:15
поделиться

Если у вас есть доступ к библиотеке curses, вы можете использовать noecho . Если вы используете компилятор Microsoft C, вы можете использовать _getch . Но, черт возьми, оба они привязывают вас к консоли. Если вам нужно прочитать stdin независимо от того, исходит ли он из консоли, файла или конвейерной команды, вам нужно указать операционной системе, как она должна обрабатывать консоль .

1
ответ дан 1 December 2019 в 19:15
поделиться

Чтобы сделать это переносимым способом, вам нужно будет использовать стандартизованную или де-факто стандартную библиотеку.

См. man 3 termios и man 3 ncurses .

Вот программа, которая будет работать в Linux и других системах Unix ...

#include <stdio.h>

int main(void) {
  int f = open("/dev/tty", 0);
  char s[100];

  system("stty -echo > /dev/tty");
  f >= 0 && read(f, s, sizeof s) > 0 &&  printf("password was %s", s);
  system("stty echo > /dev/tty");
  return 0;
}

Возможны некоторые улучшения. Вероятно, было бы лучше использовать termios, и это позволило бы избежать вилки и возможных проблем с безопасностью system (). Вероятно, было бы лучше использовать стандартный ввод-вывод для чтения пароля. (Как написано, набранный символ новой строки должен быть удален.) В Linux и некоторых других есть функция getpass (), однако она помечена как «устаревшая. Не используйте ее.». Было бы неплохо разобраться с SIGTSTP.

В целом, я мог бы поискать существующее решение, которое решает все эти небольшие проблемы ...

2
ответ дан 1 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: