Как передать пароль psql из программы на Windows - PullRequest
0 голосов
/ 17 февраля 2012

В настоящее время я работаю над функциями резервного копирования и восстановления PostgreSQL для моего проекта.Я прочитал эту http://www.codeproject.com/Articles/37154/PostgreSQL-PostGis-Operations статью и следовал этому подходу, чтобы сделать это.Он работает нормально, но недавно я изменил метод аутентификации PostgreSQL на password в файле pg_hba.con.Следовательно, он начал запрашивать пароль всякий раз, когда я выполняю psql.exe, pg_dump.exe и pg_restore.exe.Чтобы предоставить пароль через мой проект, я использовал метод «RedirectStandardInput».Но это не сработало, и psql или pg_dump по-прежнему запрашивают пароль.Однако методы "RedirectStandardOutput" и ошибки работают нормально.

Я просмотрел исходный код PostgreSQL и обнаружил, что GetConsoleMode и SetConsoleMode используются для удаления эха.Я надеюсь (не уверен), что это может быть причиной, поэтому я не могу перенаправить ввод.

Исходный код PostgreSQL для запроса пароля

simple_prompt(const char *prompt, int maxlen, bool echo)
{
    int         length;
    char       *destination;
    FILE       *termin,
               *termout;
#ifdef HAVE_TERMIOS_H
    struct termios t_orig,
                t;
#else
#ifdef WIN32
    HANDLE      t = NULL;
    LPDWORD     t_orig = NULL;
#endif
#endif
    destination = (char *) malloc(maxlen + 1);
    if (!destination)
        return NULL;

    /*
     * Do not try to collapse these into one "w+" mode file. Doesn't work on
     * some platforms (eg, HPUX 10.20).
     */
    termin = fopen(DEVTTY, "r");
    termout = fopen(DEVTTY, "w");
    if (!termin || !termout
#ifdef WIN32
    /* See DEVTTY comment for msys */
        || (getenv("OSTYPE") && strcmp(getenv("OSTYPE"), "msys") == 0)
#endif
        )
    {
        if (termin)
            fclose(termin);
        if (termout)
            fclose(termout);
        termin = stdin;
        termout = stderr;
    }

#ifdef HAVE_TERMIOS_H
    if (!echo)
    {
        tcgetattr(fileno(termin), &t);
        t_orig = t;
        t.c_lflag &= ~ECHO;
        tcsetattr(fileno(termin), TCSAFLUSH, &t);
    }
#else
#ifdef WIN32
    if (!echo)
    {
        /* get a new handle to turn echo off */
        t_orig = (LPDWORD) malloc(sizeof(DWORD));
        t = GetStdHandle(STD_INPUT_HANDLE);

        /* save the old configuration first */
        GetConsoleMode(t, t_orig);

        /* set to the new mode */
        SetConsoleMode(t, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);
    }
#endif
#endif
    if (prompt)
    {
        fputs(_(prompt), termout);
        fflush(termout);
    }

    if (fgets(destination, maxlen + 1, termin) == NULL)
        destination[0] = '\0';

    length = strlen(destination);
    if (length > 0 && destination[length - 1] != '\n')
    {
        /* eat rest of the line */
        char        buf[128];
        int         buflen;

        do
        {
            if (fgets(buf, sizeof(buf), termin) == NULL)
                break;
            buflen = strlen(buf);
        } while (buflen > 0 && buf[buflen - 1] != '\n');
    }

    if (length > 0 && destination[length - 1] == '\n')
        /* remove trailing newline */
        destination[length - 1] = '\0';
#ifdef HAVE_TERMIOS_H
    if (!echo)
    {
        tcsetattr(fileno(termin), TCSAFLUSH, &t_orig);
        fputs("\n", termout);
        fflush(termout);
    }
#else
#ifdef WIN32
    if (!echo)
    {
        /* reset to the original console mode */
        SetConsoleMode(t, *t_orig);
        fputs("\n", termout);
        fflush(termout);
        free(t_orig);
    }
#endif
#endif
    if (termin != stdin)
    {
        fclose(termin);
        fclose(termout);
    }

    return destination;
}

Пожалуйста, помогите мне здесь,как отправить пароль на psql или pg_dump через код C #.

1 Ответ

0 голосов
/ 25 марта 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...