Axe*_*ine 248 postgresql psql
如何调用psql以便它不会提示输入密码?
这就是我所拥有的:
psql -Umyuser < myscript.sql
Run Code Online (Sandbox Code Playgroud)
但是,我找不到传递密码的参数,因此psql总是提示它.
Ree*_*ece 290
有几种方法可以对PostgreSQL进行身份验证.您可能希望在https://www.postgresql.org/docs/current/static/client-authentication.html上调查密码验证的替代方法.
要回答您的问题,有几种方法可以为基于密码的身份验证提供密码.显而易见的方法是通过密码提示.您可以在pgpass文件中或通过PGPASSWORD环境变量提供密码,而不是这样.看到这些:
没有选项可以将密码作为命令行参数提供,因为该信息通常可供所有用户使用,因此不安全.但是,在Linux/Unix环境中,您可以为单个命令提供环境变量,如下所示:
PGPASSWORD=yourpass psql ...
Run Code Online (Sandbox Code Playgroud)
Gre*_*reg 152
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Run Code Online (Sandbox Code Playgroud)
jba*_*ina 66
您可以在脚本开头添加此命令行:
set PGPASSWORD=[your password]
Run Code Online (Sandbox Code Playgroud)
tan*_*ndy 47
如果您打算拥有多个主机/数据库连接,那么〜/ .pgpass文件就是您的选择.
脚步:
vim ~/.pgpass值应与您输入到〜/ .pgpass文件的值相匹配.请注意,如果您设置了导出PGPASSWORD =''变量,则它将优先于该文件.更改文件的权限以便从其他用户隐藏内容也是明智之举.这可以通过实现hostname:port:database:username:password
ajx*_*jxs 24
这可能是一个老问题,但是你可以使用一种没有人提到过的替代方法.可以直接在连接URI中指定密码.文档可以在这里找到,或者在这里找到.
您可以直接在提供的连接URI中提供您的用户名和密码psql:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
Run Code Online (Sandbox Code Playgroud)
Jam*_*ber 12
如果你在像我这样的Windows上遇到问题(我使用的是Windows 7 64位)并且set PGPASSWORD=[Password]无法正常工作.
然后,正如Kavaklioglu在其中一条评论中所说的那样,
export PGPASSWORD=[password]
Run Code Online (Sandbox Code Playgroud)
您需要将其保存在文件的顶部,或者在任何使用之前保存,以便在调用之前将其保存.
当然可以在Windows上工作:)
ubi*_*ubi 12
使用PGPASSWORD环境变量的另一种方法是conninfo根据文档使用字符串
指定连接参数的另一种方法是在 conninfo 字符串或 URI 中,它用于代替数据库名称。这种机制使您可以非常广泛地控制连接。
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
Run Code Online (Sandbox Code Playgroud)
鉴于使用PGPASSWORD环境变量的安全性问题,我认为最好的整体解决方案如下:
这里有几点值得注意.第1步是为了避免与用户可能存在的〜/ .pgpass文件混淆.您还必须确保该文件具有0600或更低的权限.
有人建议利用bash来快捷方式如下:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
Run Code Online (Sandbox Code Playgroud)
这使用<()语法来避免需要将数据写入实际文件.但它不起作用,因为psql检查正在使用的文件,并将抛出这样的错误:
WARNING: password file "/dev/fd/63" is not a plain file
Run Code Online (Sandbox Code Playgroud)
它可以简单地使用PGPASSWORD完成.我正在使用psql 9.5.10.在你的情况下,解决方案将是
PGPASSWORD=password psql -U myuser < myscript.sql
基于mightybyte的答案,对那些不熟悉*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
Run Code Online (Sandbox Code Playgroud)
第2行的双美元符号($$)/tmp/pgpasswd$$将进程ID号附加到文件名,这样该脚本可以多次运行,甚至可以同时运行,没有副作用.
请注意chmod在第4行使用命令 - 就像强大的描述中的" 非普通文件 "错误一样,如果不这样做,也会出现" 权限 "错误.
在第6行,如果使用默认值(localhost:5432)并且只有一个数据库用户,则不必使用-hmyserver,-pmyport或-Ujdoe标志.对于多个用户,(但默认连接)将该行更改为
psql mydb jdoe
Run Code Online (Sandbox Code Playgroud)
不要忘了使脚本可执行与
chmod +x runpsql(或者你称之为脚本文件的任何东西)
| 归档时间: |
|
| 查看次数: |
248919 次 |
| 最近记录: |