【问题标题】:Python: send postgres password with using subprocessPython:使用子进程发送 postgres 密码
【发布时间】:2014-10-01 15:10:28
【问题描述】:

我在使用子进程发送密码时陷入了死胡同,我不知道出了什么问题。如有任何提示,我将不胜感激。

我的代码:

os.system("sudo -u postgres -h " + db_host + " psql postgres -c \"\password\" ")
os.system("sudo -u postgres -h " + db_host + " createuser " + db_user);
print bcolors.WARNING, "Please enter your password for : " + db_user, bcolors.ENDC
str = "sudo -u postgres -h " + db_host + " psql postgres -c \"\password " + db_user + "\""
# os.system(str)
p = subprocess.Popen(['sudo','-u', 'postgres', '-h', db_host, 'psql', 'postgres', "-c", "\password", db_user],stdin=subprocess.PIPE, shell=False)
p.communicate(raw_input("Please give me a password!")

使用os.system(str) 时一切正常,但我想从用户那里获取输入的密码,并且将来我想将密码存储在配置文件中。这可能吗?

【问题讨论】:

    标签: python postgresql python-2.7


    【解决方案1】:

    停止你正在做的事情,使用psycopg2。请。你几乎不需要掏钱给psql。只需使用 PostgreSQL 的 psycopg2 本机客户端驱动程序连接即可。

    如果您需要以超级用户身份连接,请修改pg_hba.conf 以允许您的用户使用md5 密码验证,并为postgres 用户设置密码。


    os.system("sudo -u postgres -h " + db_host + " psql postgres -c \"\password\" ")

    这没有意义。您正在尝试执行命令-h。您需要先调用psql


    sudo 试图避免从标准输入读取密码。作为一种安全措施,它会关闭其标准输入并直接重新打开当前 tty,以帮助阻止人们使用捕获密码的命令包装 sudo

    所以它的目的是打败你想要做的事情。

    你可以:

    • NOPASSWD模式设置为sudopsql;
    • SUDO_ASKPASS 环境变量中将sudo -A 与 askpass 帮助程序一起使用。您可以编写一个SUDO_ASKPASS,通过为自己创建一个pipe(),从从您的程序继承的文件描述符中读取密码。
    • 使用sudo -n 禁用密码提示。如果需要密码,sudo 将失败。
    • ...或者最重要的是,不要使用sudo 运行psql,只需使用psycopg2

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2020-04-21
      • 2019-06-26
      • 2018-09-10
      • 1970-01-01
      • 2014-10-01
      • 2017-09-08
      • 1970-01-01
      相关资源
      最近更新 更多