我如何调用psql以便不提示输入密码?
这就是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,因此psql总是提示输入密码。
我如何调用psql以便不提示输入密码?
这就是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,因此psql总是提示输入密码。
Answers:
有几种向PostgreSQL进行身份验证的方法。您可能希望在https://www.postgresql.org/docs/current/static/client-authentication.html上研究密码验证的替代方法。
要回答您的问题,有几种方法可以提供用于基于密码的身份验证的密码。最明显的方法是通过密码提示。取而代之的是,您可以在pgpass文件中或通过PGPASSWORD
环境变量提供密码。看到这些:
没有选择将密码作为命令行参数提供的选项,因为该信息通常可供所有用户使用,因此不安全。但是,在Linux / Unix环境中,您可以为单个命令提供环境变量,如下所示:
PGPASSWORD=yourpass psql ...
您可以在脚本的开头添加以下命令行:
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
。
如果打算有多个主机/数据库连接,则〜/ .pgpass文件是您的理想选择。
脚步:
vim ~/.pgpass
或类似文件创建文件。以以下格式输入您的信息:
hostname:port:database:username:password
不要在字段值周围添加字符串引号。您也可以将*用作端口/数据库字段的通配符。chmod 0600 ~/.pgpass
使它不会被psql静默忽略。alias postygresy='psql --host hostname database_name -U username'
值应与您输入到〜/ .pgpass文件中的值匹配。. ~/.bashrc
或类似的方式获取您的bash个人资料。请注意,如果您设置了导出PGPASSWORD =“''变量,它将优先于文件。
chmod 600
在文件上执行,否则psql
将自动忽略该文件(根据文档)。
这可能是一个古老的问题,但是您可以使用一种没有人提及的替代方法。可以直接在连接URI中指定密码。该文件可以发现在这里,或者在这里。
您可以直接在提供给的连接URI中提供用户名和密码psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
如果您在像我这样的Windows上遇到问题(我使用的是Windows 7 64位系统),则set PGPASSWORD=[Password]
无法正常工作。
然后,正如Kavaklioglu在其中一项评论中所说,
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
这使用<()语法来避免需要将数据写入实际文件。但这是行不通的,因为psql会检查正在使用的文件,并会引发如下错误:
WARNING: password file "/dev/fd/63" is not a plain file
对于那些不熟悉* nix shell脚本的人,以maybybyte的答案为基础,这是一个有效的脚本:
#!/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的建议,并在将密码放入文件之前使文件不可读。这就关闭了一个小的安全漏洞。谢谢!
chmod 600
在创建文件之后但在将密码写入文件之前执行以下操作。如所写,服务器上的恶意脚本可能会不断尝试读取这种格式的文件,有时会成功获取密码。另外,如果该脚本由于某种原因被中断,该文件将保留在磁盘上-编写shell trap
处理程序将解决此问题。鉴于编写这样的安全脚本并非易事,我建议export PGPASSWORD
改为使用。
PGPASSWORD
在9.3中已弃用,所以需要这种解决方案。
您可能会发现这很有用: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