使用Ruby popen和PostgreSQL createuser
我正在尝试编写一个非常简单的rake任务(并将其合并为一个相当大的rake任务),它将调用以下命令并传入一个随机生成的密码。目前,我们甚至可以假装随机生成,只需给它一个设置密码“test”:使用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",
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不会破坏标准的密码提示,而是让我键入它…;)我之前已经考虑过了,但我希望找到另一种方法,因为使用这种方法,密码将被回响到屏幕上。我也许能阻止它,但我怀疑它。然后,这些都将在根帐户下运行。