2

我正在尝试编写一个非常简单的 rake 任务(并将其合并为一个相当大的 rake 任务),它将调用以下命令并传入一个随机生成的密码。目前,让我们甚至伪造随机生成,并给它一个设置密码“测试”:

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 系统上,以防万一。

4

2 回答 2

4

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

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

无论如何,一个strace(1)显示createuser实际上是开放的/dev/tty

一切都没有丢失,createuser只是/usr/share/postgresql-common/pg_wrapper一个 Perl 程序的链接。我确信它可以被黑客入侵以实现密码脚本兼容性。

于 2009-11-12T20:07:13.877 回答
0

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

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

它似乎更安全,更可靠。

于 2009-11-12T19:19:13.367 回答