Postgresql:使用密码编写psql执行脚本
如何调用psql,使其不提示输入密码 这就是我所拥有的:Postgresql:使用密码编写psql执行脚本,postgresql,psql,Postgresql,Psql,如何调用psql,使其不提示输入密码 这就是我所拥有的: psql -Umyuser < myscript.sql psql-Umyuser
psql -Umyuser < myscript.sql
psql-Umyuser
但是,我找不到传递密码的参数,因此psql总是提示输入密码。您必须创建一个密码文件:有关详细信息,请参阅。您可能会发现这很有用:有几种方法可以验证PostgreSQL。您可能希望调查密码身份验证的替代方案 要回答您的问题,有几种方法可以为基于密码的身份验证提供密码:
- 在pgpass文件中提供密码或
- 通过
环境变量PGPASSWORD
- 请看这些:
可以在脚本开头添加以下命令行:
set PGPASSWORD=[your password]
PGPASSWORD=[your password]psql-Umyuser
如果您在像我这样的windows上遇到问题(我使用的是64位windows 7),并且set PGPASSWORD=[Password]
不起作用
然后,正如Kavaklioglu在一篇评论中所说
export PGPASSWORD=[password]
您需要将其保存在文件的顶部,或在任何使用之前,以便在调用之前将其设置好
当然可以在windows上使用:)考虑到使用PGPASSWORD环境变量的安全性问题,我认为最好的总体解决方案如下:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
如果您打算拥有多个主机/数据库连接,那么最好的方法就是这样 步骤:
vim~/.pgpass
或类似工具创建文件。按以下格式输入您的信息:
hostname:port:database:username:password
不要在字段值周围添加字符串引号。您还可以使用*作为端口/数据库字段的通配符chmod 0600~/.pgpass
,以便psql不会自动忽略它alias postygresy='psql--host hostname数据库\U name-U username'
这些值应该与输入到~/.pgpass文件中的值相匹配~/”为bash配置文件提供源代码。bashrc
或类似产品李>
#!/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描述的“非普通文件”错误一样,如果不这样做,也会出现“权限”错误
在第7行,如果使用默认值(localhost:5432)并且只有一个数据库用户,则不必使用-h
myserver、-p
myport或-U
jdoe标志。对于多个用户,(但默认连接)将该行更改为
psql mydb jdoe
别忘了用
chmod+x runpsql
(或您称之为脚本文件的任何内容)
更新:
我接受了RichVel的建议,在将密码放入文件之前使文件无法读取。这填补了一个小小的安全漏洞。
谢谢 在命令中使用-w:
psql-h localhost-p 5432-U user-w我发现,即使您定义了PGPASSWORD变量,psql也会显示密码提示,但是您可以为psql指定-w选项来省略密码提示。只需使用PGPASSWORD即可。我正在使用PSQL9.5.10。在你的情况下,解决办法是
PGPASSWORD=password psql-U myuser
这可能是一个老问题,但有一种替代方法可以使用,没有人提到过。可以直接在连接URI中指定密码。或者,也可以找到文档
您可以在提供给psql
的连接URI中直接提供用户名和密码:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
8年后
在我的mac电脑上,我必须在文件中插入一行
~/.pgpass
类似:
<IP>:<PORT>:<dbname>:<user>:<password>
::
另请参见:使用
PGPASSWORD
环境变量的替代方法是根据
指定连接参数的另一种方法是在conninfo中
字符串或URI,用于代替数据库名称。这
该机制使您可以非常广泛地控制连接
$psql“主机=端口=5432数据库名=用户=密码=”
博士后=>
这也适用于其他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已被弃用,但仍然有效,顺便说一句。仅供参考,它已被弃用(因此在
<IP>:<PORT>:<dbname>:<user>:<password>
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
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 &