Я хотел бы предоставить пароль для пользователя MyUser в psql.exe. К сожалению, вся моя попытка потерпела неудачу. См. Следующий код:Как отправить входные данные в Postgres psql.exe?
var psi = new ProcessStartInfo(@"c:\Program Files\PostgreSQL\9.5\bin\psql.exe", "-w -t -h localhost -p 5432 -U MyUser -c \"SHOW data_directory\"")
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using (var process = new Process { StartInfo = psi })
{
process.OutputDataReceived += (sender, e) =>
{
Console.WriteLine($"Output: {e.Data}");
};
process.ErrorDataReceived += (sender, e) =>
{
Console.WriteLine($"Error: {e.Data}");
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.StandardInput.WriteLine("Password");
process.StandardInput.Flush();
process.WaitForExit();
Console.WriteLine($"Exit code: {process.ExitCode}");
}
psql.exe никогда не читает пароль из перенаправленного стандартного ввода. Таким образом, процесс зависает на WaitForExit. Если я использую CreateNoWindow = false, то я могу написать пароль в окне консоли и получить ответы в OutputDataReceived, ErrorDataReceived, но это не то, что мне нужно. Мне нужно запустить psql.exe без взаимодействия с пользователем. Обратите внимание, что пароль не должен храниться в pgpass.conf.
Интересно, что я могу вызвать pg_ctl.exe и начать/остановить postgres очень легко, но если я хочу спросить базу данных о чем-то, есть такая большая проблема. Конечно, я могу создать обходное решение для моей потребности вызвать psql.exe следующим образом: Вставить пароль в pgpass.conf, перезапустить posgtgres, выполнить то, что мне нужно, psql.exe, удалить запись из pgpass.conf. Но это, кажется, немного переборщило :-) – user2126375
@ user2126375, что действительно неудивительно. Запуск/остановка базы данных не изменяет и не передает конфиденциальные данные. Так что это гораздо менее критично. Даже когда я не разделяю ваше мнение о чем-то вроде написания файла, который переполняется (давайте, это действительно тривиально реализовать), не делайте этого - все будет мгновенно разорваться, если два процесса попытаются изменить файл. Плохая идея. На самом деле, просто используйте существующие библиотеки. Это не сложнее, чем вызов программы. –
Хорошо, поймите, я буду использовать Npgsql для этой задачи: «Где хранятся данные для хоста/порта (кластера)?» процесс установки моего приложения. Я попытался выбрать psql.exe, потому что другие шаги в процессе инсталляции используют * .exe файлы из папки bin в postgres (pg_ctl, pg_basebackup, ...). Или есть ли другой простой способ получить папку данных для комбинации хостов и портов? (Я бы хотел избежать реестра Windows) – user2126375