Использование Ruby popen и PostgreSQL createuser - PullRequest
2 голосов
/ 12 ноября 2009

Я пытаюсь написать очень простую задачу rake (и объединить ее в довольно большую задачу rake), которая вызовет следующую команду и передаст случайно сгенерированный пароль. На данный момент давайте даже подделаем случайную генерацию и просто дадим ей установленный пароль «test»:

createuser -SDPRE test

Код, который я имею для своей задачи, выглядит следующим образом:

desc "Create a test user with test password"
task "test" do
  puts('Creating User')
  IO.popen "createuser -SDRPE test", 'w+' do |io|
    io.write "test\ntest\n"
    io.close_write
  end

  raise 'createuser failed' unless $?.success?
end

Кажется, что io.write не работает, так как мне все еще нужно ввести пароль. Это также не забито. После запуска задачи и ввода пароля вручную, я могу использовать этот пароль для входа в систему с psql.

Я пробовал довольно много вариантов, таких как io.close, открывая файл как 'w' и даже 'r' или 'r+', потому что я видел другие примеры, которые его используют.

Я немного озадачен тем, как заставить это работать. Любые идеи / комментарии / ответы будут с благодарностью!

Редактировать 1: Это на системе Debian (Lenny) Linux на случай, если что-то изменится.

Ответы [ 2 ]

4 голосов
/ 12 ноября 2009

createuser открывает /dev/tty, чтобы прочитать пароль

Программы, которые читают пароли, обычно жертвуют парадигмой инструментов Unix по отношению к паролям. Это разумная вещь, потому что она позволяет другим функциям учитывать стандартный ввод и вывод и ставить все это на паузу, пока он открывает /dev/tty для интерактивного пароля.

В любом случае strace(1) показывает, что createuser фактически открывает /dev/tty.

Не все потеряно, createuser - это просто ссылка на /usr/share/postgresql-common/pg_wrapper, которая является программой на Perl. Я уверен, что он может быть взломан для совместимости сценариев паролей.

0 голосов
/ 12 ноября 2009

Я знаю, что это не ответ на ваш вопрос, но рассматривали ли вы создание пользователя PG с использованием SQL вместо вызова команд оболочки?

http://www.postgresql.org/docs/8.0/interactive/sql-createuser.html

Кажется, безопаснее и надежнее.

...