PostgreSQL: 使用带密码的脚本执行 psql

400

我该如何调用psql,使其不提示输入密码

这是我的代码:

psql -Umyuser < myscript.sql

然而,我找不到传递密码的参数,所以psql总是提示输入密码。


5
我最终选择了PGPASSWORD环境变量。这完美地适合我的用例。在脚本中简单且自包含。 - Axel Fontaine
刚刚发现了这个网站:http://postgresguide.com/utilities/psql.html - D_C
可能是与此问题重复:如何在非交互式 psql 中指定密码? - Helder Pereira
17个回答

512
你可能想要阅读一份关于PostgreSQL身份验证方式的摘要

回答你的问题,有几种方法可以提供用于基于密码的身份验证的密码:

  1. 通过密码提示输入密码。例如:

    psql -h uta.biocommons.org -U foo
    Password for user foo: 
    
  2. 在pgpass文件中。请参见libpq-pgpass。格式:

  3. <host>:<port>:<database>:<user>:<password>
    
  4. 使用PGPASSWORD环境变量。参见libpq-envars。示例:

  5. export PGPASSWORD=yourpass
    psql ...
    
    # Or in one line for this invocation only:
    PGPASSWORD=yourpass psql ...
    
  6. 在连接字符串中,密码和其他选项可以在连接字符串/URI中指定。请参见app-psql。例如:

  7. psql postgresql://username:password@dbmaster:5433/mydb?sslmode=require
    

18
我认为PGPASSWORD已经被废弃了,但仍然可以使用。顺带一提。 - Scott Marlowe
49
是的,它已被弃用(并在其中一个链接中有说明)。由于它已经出现,值得注意的是,该弃用受到激烈争议,因为它对许多人非常有用,然而在某些情况下可能会被使用而没有严重的安全问题。我认为它并不比例如将.pgpas存储在NFS文件系统上更糟糕。我经常使用PGPASSWORD。 - Reece
8
命令行信息“可供所有用户使用”的想法基于过时的多用户系统假设,不适用于大多数现代环境,这些环境只运行单个应用程序并且全部自动化。 - Alex R
4
2021年快进:对于使用PostgreSQL 13版本的人,“PGPASSWORD=yourpass psql …”在版本13中似乎不再起作用(在我的情况下是在Debian 10上),因此我成功地使用了连接字符串,如官方文档所述。 - iLuvLogix
2
对我来说可以。在 Mac 上使用 psql (PostgreSQL) 13.2 - jbrown
显示剩余3条评论

196
PGPASSWORD=[your password] psql -Umyuser < myscript.sql

1
这在 Terraform 中也有效。你,我的朋友,是救命恩人。 - wildthing81

82
你可以在脚本开头添加这个命令行:
export PGPASSWORD="[your password]"

29
在我的情况下,set命令无效,但export PGPASSWORD=[password]命令有效。 - Can Kavaklıoğlu
1
它在shell脚本中无法工作。我正在使用以下代码:#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF - Govind Gupta
3
尝试不使用空格,例如 PGPASSWORD=password - Ariejan

59
如果您想要有多个主机/数据库连接,~/.pgpass文件是正确的选择。
步骤:
1. 使用vim ~/.pgpass或类似命令创建文件。按以下格式输入信息:hostname:port:database:username:password。不要在字段值周围添加字符串引号。您还可以使用*作为端口/数据库字段的通配符。 2. 您必须chmod 0600 ~/.pgpass以防止psql忽略该文件。 3. 在bash配置文件中创建别名,以便为您运行psql命令。例如:alias postygresy='psql --host hostname database_name -U username'。值应与您输入到~/.pgpass文件中的值匹配。 4. 使用. ~/.bashrc或类似命令加载bash配置文件。 5. 从命令行键入别名。
请注意,如果您设置了export PGPASSWORD=''变量,则它将优先于该文件。

2
你必须对该文件执行 chmod 600 命令,否则 psql 将会在不发出任何警告的情况下忽略它(根据文档)。 - RichVel
这可能不是在Windows服务器上一个好的解决方案,因为许多东西都是以没有用户目录的用户身份运行的。 - Jim Lutz

58

这可能是一个老问题,但有一种未被提及的替代方法。可以在连接URI中直接指定密码。文档可以在这里找到,另外还可以在这里找到。

您可以直接在提供给psql的连接URI中提供您的用户名和密码:

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb

2
PostgreSQL 9.3 忽略环境变量 PGPASSWORD - david.perez
为了使其正常工作,可能需要引用参数:psql.exe“postgresql://username:password@address:5432/database” - Ivan Chau

22

根据文档,使用conninfo字符串是使用PGPASSWORD环境变量的另一种选择。

另一种指定连接参数的方法是在conninfo字符串或URI中,它代替数据库名称使用。这种机制使您对连接有非常广泛的控制。

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>

2
这对于进行健全性测试很有用,如果其他方法无效的话。此外,只需在命令前加一个空格,就可以将密码从你的Shell历史记录中隐藏起来。 - vhs

13

如果您像我一样在Windows上遇到问题(我正在使用64位的Windows 7),并且set PGPASSWORD=[Password]没有起作用。

那么,正如Kavaklioglu在其中一条评论中所说的那样,

export PGPASSWORD=[password]

你需要将这个保存在文件的顶部,或者在任何使用之前设置,以便在调用之前进行设置。

当然可以在Windows上工作:)


1
“export PGPASSWORD=[password]”在命令行(cmd.exe)中对我无效。您确定您没有使用cygwin或类似的东西吗? - Devin Snyder
只能在cl中使用,你已经将它添加到文件中了吗?现在只需在命令行中输入即可。 - Jamie Hutber
对于 Linux/Mac 环境来说没问题,而对于 Windows 系统,我认为你需要找到一种方法来导出这个环境变量。 - Pengfei.X
所以添加一个全局密码...那也是个有趣的想法。 - Jamie Hutber

13

8
考虑到使用PGPASSWORD环境变量存在安全隐患,我认为最好的解决方案如下:
1.编写自己的临时pgpass文件,并将所需密码存入其中。 2.使用PGPASSFILE环境变量告知psql使用该文件。 3.删除临时pgpass文件。
需要注意以下几点。步骤1是为了避免对可能存在的用户~/.pgpass文件进行修改。您还必须确保该文件的权限为0600或更低。
有人建议利用bash来快捷完成此操作,具体如下:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

使用<()语法可以避免需要将数据写入实际文件中。但是这种方法不起作用,因为psql会检查正在使用的文件,并会抛出如下错误:

WARNING: password file "/dev/fd/63" is not a plain file

这种方法的一个工作示例出现在https://dev59.com/fGw15IYBdhLWcg3wkcuq#40614592中 - 这个问题的另一个答案。 - Eliyahu Skoczylas
1
尽管这个用户没有真正询问我正在寻找的东西,但我认为这种方法并不匹配。在使用PGPASSFILE = <(任何内容)>语法时,您可以执行诸如解密文件等操作,并仅将其存在于创建的文件描述符中。通过编写临时文件,您并未从根本上解决具有凭据的磁盘文件的问题。处理类似这样的任意行业规则并不好玩,但许多人都会遇到这种情况。 - Desidero

8
可以使用PGPASSWORD简单地完成。我正在使用psql 9.5.10版本。对于你的情况,解决方案如下:
PGPASSWORD=password psql -U myuser < myscript.sql

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接