【发布时间】:2011-09-25 06:23:25
【问题描述】:
如何调用 psql 使其不提示输入密码?
这就是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,所以 psql 总是提示输入它。
【问题讨论】:
-
我最终选择了 PGPASSWORD 环境变量。这非常适合我的用例。脚本中简单且独立。
标签: postgresql psql
如何调用 psql 使其不提示输入密码?
这就是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,所以 psql 总是提示输入它。
【问题讨论】:
标签: postgresql psql
您不妨阅读the ways to authenticate to PostgreSQL 的摘要。
为了回答您的问题,有几种方法可以为基于密码的身份验证提供密码:
通过密码提示。示例:
psql -h uta.biocommons.org -U foo
Password for user foo:
在 pgpass 文件中。见libpq-pgpass。格式:
<host>:<port>:<database>:<user>:<password>
使用PGPASSWORD 环境变量。见libpq-envars。示例:
export PGPASSWORD=yourpass
psql ...
# Or in one line for this invocation only:
PGPASSWORD=yourpass psql ...
在连接字符串中 密码和其他选项可以在连接字符串/URI 中指定。见app-psql。示例:
psql postgresql://username:password@dbmaster:5433/mydb?sslmode=require
【讨论】:
PGPASSWORD=yourpass psql ... 似乎不再适用于版本 13(在我的情况下是 Debian 10),因此我成功地将连接字符串作为在official docs 中解释
psql (PostgreSQL) 13.2 在 Mac 上。
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
【讨论】:
您可以在脚本开头添加此命令行:
set PGPASSWORD=[your password]
【讨论】:
export PGPASSWORD=[password] 确实起作用
#!/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
PGPASSWORD=password.
【讨论】:
PGPASSWORD
psql.exe "postgresql://username:password@address:5432/database"
如果您打算拥有多个主机/数据库连接,~/.pgpass file 是您的最佳选择。
步骤:
vim ~/.pgpass 或类似方法创建文件。请按以下格式输入您的信息:
hostname:port:database:username:password 不要在字段值周围添加字符串引号。您还可以使用 * 作为端口/数据库字段的通配符。chmod 0600 ~/.pgpass 以使其不会被 psql 静默忽略。alias postygresy='psql --host hostname database_name -U username' 这些值应该与您输入到 ~/.pgpass 文件中的值匹配。. ~/.bashrc 或类似名称获取您的 bash 配置文件。 请注意,如果您设置了 export PGPASSWORD='' 变量,它将优先于文件。
【讨论】:
chmod 600,否则psql 会默默忽略它(根据文档)。
使用PGPASSWORD 环境变量的替代方法是根据documentation 使用conninfo 字符串
另一种指定连接参数的方法是在 conninfo 字符串或 URI,用于代替数据库名称。这 机制让您可以非常广泛地控制连接。
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
【讨论】:
如果您在像我这样的 Windows 上遇到问题(我使用的是 Windows 7 64 位)并且set PGPASSWORD=[Password] 不起作用。
然后,正如 Kavaklioglu 在其中一个 cmets 中所说,
export PGPASSWORD=[password]
您需要将其保存在文件顶部,或在任何使用之前保存,以便在调用之前对其进行设置。
当然可以在 windows 上工作:)
【讨论】:
export PGPASSWORD=[password] 对我使用命令行 (cmd.exe) 根本不起作用。你确定你没有使用 cygwin 或类似的东西吗?
您必须创建一个密码文件:请参阅http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html 了解更多信息。
【讨论】:
考虑到使用PGPASSWORD环境变量的安全问题,我认为最好的整体解决方案如下:
这里有几点需要注意。第 1 步是为了避免弄乱可能存在的用户 ~/.pgpass 文件。您还必须确保该文件的权限为 0600 或更少。
有些人建议利用 bash 来简化此操作,如下所示:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
这使用
WARNING: password file "/dev/fd/63" is not a plain file
【讨论】:
只需使用 PGPASSWORD 即可完成。我正在使用 psql 9.5.10。在你的情况下,解决方案是
PGPASSWORD=password psql -U myuser < myscript.sql
【讨论】:
在mightybyte's answer 的基础上为那些不熟悉 *nix shell 脚本的人提供了一个工作脚本:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
第 2 行 /tmp/pgpasswd$$ 中的双美元符号 ($$) 将进程 ID 号附加到文件名,因此该脚本可以多次运行,甚至可以同时运行,而不会产生副作用。
注意在第 4 行使用 chmod 命令 - 就像 mightybyte 描述的“not a plain file”错误一样,还有一个“permissions”如果不这样做会出错。
在第 7 行,您不必使用 -hmyserver、-pmyport 或 -Ujdoe em> 标志,如果您使用默认值 (localhost : 5432) 并且只有一个数据库用户。对于多个用户,(但默认连接)将该行更改为
psql mydb jdoe
别忘了用
使脚本可执行
chmod +x runpsql(或任何你称之为脚本文件的东西)
更新:
我接受了 RichVel 的建议,在将密码放入其中之前使文件不可读。这关闭了一个轻微的安全漏洞。 谢谢!
【讨论】:
mktemp 创建一个临时文件,而不是想出自己的命名方案。它创建一个新的临时文件(在 Linux 中命名为 /tmp/tmp.ITXUNYgiNh,在 MacOS X 中命名为 /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4)并将其名称打印到标准输出。
chmod 600。如前所述,服务器上的恶意脚本可能会不断尝试读取这种格式的文件,并且有时会成功获取密码。此外,如果此脚本由于某种原因被中断,文件将留在磁盘上 - 编写 shell trap 处理程序将解决此问题。鉴于编写这样的安全脚本并非易事,我建议改用export PGPASSWORD。
PGPASSWORD 在 9.3 中已被弃用。
8 年后……
在我的 Mac 上,我必须在文件中添加一行
~/.pgpass点赞:
<IP>:<PORT>:<dbname>:<user>:<password>
另见:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
【讨论】:
这也适用于其他 postgresql cli,例如您可以在非交互模式下运行 pgbench。
export PGPASSWORD=yourpassword
/usr/pgsql-9.5/bin/pgbench -h $REMOTE_PG_HOST -p 5432 -U postgres -c 12 -j 4 -t 10000 example > pgbench.out 2>&1 &
【讨论】:
我发现,即使您定义了 PGPASSWORD 变量,psql 也会显示密码提示,但是您可以为 psql 指定 -w 选项以省略密码提示。
【讨论】:
在命令中使用 -w: psql -h localhost -p 5432 -U 用户 -w
【讨论】: