如何调用psql使其不提示输入密码?
这就是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,因此 psql 总是提示输入密码。
如何调用psql使其不提示输入密码?
这就是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,因此 psql 总是提示输入密码。
您可能希望阅读对 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=[your password] psql -Umyuser < myscript.sql
您可以在脚本开头添加此命令行:
set PGPASSWORD=[your password]
如果您打算拥有多个主机/数据库连接,则~/.pgpass 文件是要走的路。
脚步:
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='' 变量,它将优先于文件。
使用PGPASSWORD
环境变量的另一种方法是conninfo
根据文档使用字符串
指定连接参数的另一种方法是使用 conninfo 字符串或 URI,而不是数据库名称。这种机制使您可以非常广泛地控制连接。
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
如果您在像我这样的 Windows 上遇到问题(我使用的是 Windows 7 64 位)并且set PGPASSWORD=[Password]
无法正常工作。
然后,正如 Kavaklioglu 在其中一条评论中所说,
export PGPASSWORD=[password]
您需要将其保存在文件顶部,或在任何使用之前保存,以便在调用之前对其进行设置。
当然可以在 Windows 上工作:)
您必须创建一个密码文件:有关更多信息,请参阅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
这使用 <() 语法来避免需要将数据写入实际文件。但它不起作用,因为 psql 检查正在使用的文件并会抛出如下错误:
WARNING: password file "/dev/fd/63" is not a plain file
只需使用 PGPASSWORD 即可完成。我正在使用 psql 9.5.10。在您的情况下,解决方案是
PGPASSWORD=password psql -U myuser < myscript.sql
对于不熟悉*nix shell 脚本的人来说,基于mightybyte 的回答,这里有一个工作脚本:
#!/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 号附加到文件名中,因此该脚本可以多次运行,甚至可以同时运行,而不会产生副作用。
请注意第chmod
4 行命令的使用 - 就像mayybyte描述的“不是普通文件”错误一样,如果不这样做,也会出现“权限”错误。
在第 7 行,如果您使用默认值 ( localhost : 5432 ) 并且只有一个数据库用户,则不必使用-h
myserver、-p
myport或-U
jdoe标志。对于多个用户,(但默认连接)将该行更改为
psql mydb jdoe
不要忘记使脚本可执行
chmod +x runpsql
(或任何你称之为脚本文件的东西)
更新:
在输入密码之前,我接受了RichVel的建议并使文件不可读。这关闭了一个轻微的安全漏洞。谢谢!
您可能会发现这很有用:Windows PSQL 命令行:有没有办法允许无密码登录?
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 user -w