使用Ruby popen和PostgreSQL createuser

使用Ruby popen和PostgreSQL createuser,ruby,shell,rake,popen,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",

我正在尝试编写一个非常简单的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系统上的,以防有任何不同。

我知道这不是对您问题的回答,但您是否考虑过使用SQL而不是调用shell命令来创建PG user

它看起来更安全、更可靠。

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

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


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

谢谢你提供的信息。很高兴知道它根本不起作用:-)谢谢,我一直在想(虽然显然不足以真正了解)这些东西是如何工作的:为什么将sql管道传输到psql不会破坏标准的密码提示,而是让我键入它…;)我之前已经考虑过了,但我希望找到另一种方法,因为使用这种方法,密码将被回响到屏幕上。我也许能阻止它,但我怀疑它。然后,这些都将在根帐户下运行。