我正在尝试编写一个非常简单的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系统上,如果它有任何区别。
答案 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
它似乎更安全,更可靠。