如何调用 psql 以便不会提示输入密码?
这就是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,因此psql总是提示它。
答案 0 :(得分:274)
有几种方法可以对PostgreSQL进行身份验证。您可能希望在https://www.postgresql.org/docs/current/static/client-authentication.html调查密码身份验证的替代方案。
要回答您的问题,有几种方法可以为基于密码的身份验证提供密码。显而易见的方法是通过密码提示。您可以在pgpass文件中或通过PGPASSWORD
环境变量提供密码,而不是这样。见这些:
没有选项可以将密码作为命令行参数提供,因为该信息通常可供所有用户使用,因此不安全。但是,在Linux / Unix环境中,您可以为单个命令提供环境变量,如下所示:
PGPASSWORD=yourpass psql ...
答案 1 :(得分:146)
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
答案 2 :(得分:63)
您可以在脚本的开头添加此命令行:
set PGPASSWORD=[your password]
答案 3 :(得分:45)
如果您打算拥有多个主机/数据库连接,~/.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个人资料。 请注意,如果您设置了导出PGPASSWORD =''变量,则它将优先于该文件。
答案 4 :(得分:18)
这可能是一个古老的问题,但是您可以使用一种没有人提及的替代方法。可以直接在连接URI中指定密码。可以在here或here中找到该文档。
您可以直接在提供给psql
的连接URI中提供用户名和密码:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
答案 5 :(得分:12)
您必须创建密码文件:有关详细信息,请参阅http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html。
答案 6 :(得分:12)
如果您在像我这样的Windows上遇到问题(我使用的是Windows 7 64位),set PGPASSWORD=[Password]
无效。
然后,正如Kavaklioglu在其中一条评论中所说,
export PGPASSWORD=[password]
您需要将此文件保存在文件的顶部,或者在任何使用之前保存,以便在调用之前将其保存。
当然可以在Windows上工作:)
答案 7 :(得分:6)
考虑到使用PGPASSWORD环境变量的安全性问题,我认为最好的整体解决方案如下:
这里有几点需要注意。第1步是为了避免与用户可能存在的〜/ .pgpass文件混淆。您还必须确保该文件具有0600或更低的权限。
有些人建议利用bash来快速执行此操作,如下所示:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
这使用&lt;()语法来避免需要将数据写入实际文件。但它不起作用,因为psql检查正在使用的文件,并将抛出这样的错误:
WARNING: password file "/dev/fd/63" is not a plain file
答案 8 :(得分:6)
可以使用PGPASSWORD简单地完成。我正在使用psql 9.5.10。在您的情况下,解决方案将是
PGPASSWORD=password psql -U myuser < myscript.sql
答案 9 :(得分:5)
在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 plain file ”错误一样,还有一个“如果没有这样做,权限“错误。
在第7行,您不必使用-h
myserver ,-p
myport 或-U
jdoe 标志,如果您使用默认值( localhost : 5432 )并且只有一个数据库用户。对于多个用户,(但默认连接)将该行更改为
psql mydb jdoe
不要忘记使用
创建脚本可执行文件
chmod +x runpsql
(或您称之为脚本文件的任何内容)
<强>更新强>
我提出了 RichVel 的建议,并在将密码输入之前使文件不可读。这关闭了一个小小的安全漏洞。 谢谢!
答案 10 :(得分:2)
答案 11 :(得分:2)
使用PGPASSWORD
环境变量的另一种方法是根据documentation
conninfo
字符串
在conninfo中指定连接参数的另一种方法 字符串或URI,而不是数据库名称。这个 机制使您可以非常广泛地控制连接。
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
答案 12 :(得分:0)
8年后...
在Mac上,我不得不在文件中添加一行
~/.pgpass
喜欢:
<IP>:<PORT>:<dbname>:<user>:<password>
另请参阅:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
答案 13 :(得分:-1)
我发现,即使你定义PGPASSWORD变量,psql显示密码提示,但是你可以为psql指定-w选项来省略密码提示。
答案 14 :(得分:-1)
这也适用于其他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 &
答案 15 :(得分:-5)
在命令中使用-w: psql -h localhost -p 5432 -U user -w