使用Ruby popen和PostgreSQL createuser

时间:2009-11-12 18:28:06

标签: ruby shell rake popen

我正在尝试编写一个非常简单的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+',因为我看到了其他使用它的示例。< / p>

我对如何让它发挥作用感到有些困惑。任何想法/意见/答案将不胜感激!

编辑1:这是在Debian(Lenny)Linux系统上,如果它有任何区别。

2 个答案:

答案 0 :(得分:4)

createuser正在打开/dev/tty以读取密码

读取密码的程序通常会牺牲关于密码的Unix工具范例。这是一个合理的做法,因为它允许其他功能尊重标准输入和输出,并在打开/dev/tty时为交互式密码暂停。

在任何情况下,strace(1)都会显示createuser实际上正在打开/dev/tty

所有内容都不会丢失,createuser只是指向/usr/share/postgresql-common/pg_wrapper的链接,这是一个Perl程序。我确信它可以被黑客攻击密码脚本兼容性。

答案 1 :(得分:0)

我知道这不是你问题的答案,但是你考虑过使用SQL而不是调用shell命令来创建PG用户吗?

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

它似乎更安全,更可靠。