【问题标题】:Using Ruby popen and PostgreSQL createuser使用 Ruby popen 和 PostgreSQL createuser
【发布时间】:2009-11-12 18:28:06
【问题描述】:

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

我有点不知道如何让它发挥作用。任何想法/cmets/答案将不胜感激!

编辑 1:这是在 Debian (Lenny) Linux 系统上,以防万一。

【问题讨论】:

    标签: ruby shell rake popen


    【解决方案1】:

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

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

    无论如何,strace(1) 表明createuser 实际上正在打开/dev/tty

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

    【讨论】:

    • 感谢您的信息。很高兴知道它根本不起作用:-)
    • 谢谢,我一直想知道(虽然显然不足以真正找出)这些东西是如何工作的:为什么将 sql 管道连接到 psql 不会破坏标准密码提示,而是要求我输入它... ;)
    【解决方案2】:

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

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

    似乎更安全可靠。

    【讨论】:

    • 我之前考虑过,但我希望找到另一种方法,因为使用这种方法,密码会回显到屏幕上。我也许可以阻止它,但我对此表示怀疑。话又说回来,这一切都将在 root 帐户下运行。
    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多