2016-05-20 5 views
0

Я хотел бы предоставить пароль для пользователя 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.

ответ

3

В принципе, это мера безопасности, согласно которой psql не берет пароли из нетерминального источника ввода.

собственно способ сделать что-то с базой данных PostgreSQL с любого языка программирования, который имеет хорошие библиотеки для этого (например, C# /. NET), чтобы просто использовать клиентскую библиотеку для подключения к базе данных и не называем внешний процесс.

+0

Интересно, что я могу вызвать pg_ctl.exe и начать/остановить postgres очень легко, но если я хочу спросить базу данных о чем-то, есть такая большая проблема. Конечно, я могу создать обходное решение для моей потребности вызвать psql.exe следующим образом: Вставить пароль в pgpass.conf, перезапустить posgtgres, выполнить то, что мне нужно, psql.exe, удалить запись из pgpass.conf. Но это, кажется, немного переборщило :-) – user2126375

+0

@ user2126375, что действительно неудивительно. Запуск/остановка базы данных не изменяет и не передает конфиденциальные данные. Так что это гораздо менее критично. Даже когда я не разделяю ваше мнение о чем-то вроде написания файла, который переполняется (давайте, это действительно тривиально реализовать), не делайте этого - все будет мгновенно разорваться, если два процесса попытаются изменить файл. Плохая идея. На самом деле, просто используйте существующие библиотеки. Это не сложнее, чем вызов программы. –

+0

Хорошо, поймите, я буду использовать Npgsql для этой задачи: «Где хранятся данные для хоста/порта (кластера)?» процесс установки моего приложения. Я попытался выбрать psql.exe, потому что другие шаги в процессе инсталляции используют * .exe файлы из папки bin в postgres (pg_ctl, pg_basebackup, ...). Или есть ли другой простой способ получить папку данных для комбинации хостов и портов? (Я бы хотел избежать реестра Windows) – user2126375

0

Попробуйте:

proc.StartInfo.EnvironmentVariables["PGPASSWORD"] = "mypass"; 

Это работает для меня.

Смежные вопросы