如何调用psql使其不会提示输入密码?
这是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,所以psql总是提示输入这个参数。
你必须创建一个密码文件:参见http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html获取更多信息。
你可能会发现这个有用:Windows PSQL命令行:有没有一种方法允许无密码登录?
你可能希望阅读向PostgreSQL进行身份验证的方法的摘要。
为了回答你的问题,有几种方法为基于密码的身份验证提供密码:
psql -h uta.biocommons.org -U foo Password for user foo:
<host>:<port>:<database>:<user>:<password>
PGPASSWORD
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
你可以在脚本的开头添加这个命令行:
export PGPASSWORD="[your password]"
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
如果你像我一样在windows上有问题(我使用的是windows 7 64位),set PGPASSWORD=[Password]不工作。
set PGPASSWORD=[Password]
然后,正如Kavaklioglu在其中一条评论中所说,
export PGPASSWORD=[password]
您需要将其保存在文件的顶部,或者在任何使用之前,以便在调用之前设置它。
当然可以在windows上工作:)
考虑到使用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
如果你想要有多个主机/数据库连接,~ /。pgpass文件是正确的方法。
步骤:
vim ~/.pgpass
chmod 0600 ~/.pgpass
alias postygresy='psql --host hostname database_name -U username'
. ~/.bashrc
注意,如果设置了export PGPASSWORD= "变量,它将优先于文件。
对于那些不习惯* 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
/tmp/pgpasswd$$中的双美元符号($$)在第2行将进程ID号附加到文件名,因此该脚本可以多次运行,甚至同时运行,而不会产生副作用。
/tmp/pgpasswd$$
$$
注意在第4行使用chmod命令——就像mightybyte描述的“不是普通文件”错误一样,如果不这样做,也会出现“权限”错误。
chmod
在第7行,如果你使用默认值(本地主机: 5432)并且只有一个数据库用户,你将不必使用-hmyserver、-pmyport或-Ujdoe标志。对于多个用户,(但默认连接)将该行更改为
-h
-p
-U
psql mydb jdoe
不要忘记使脚本可执行的 with
chmod +x runpsql (或者不管你怎么称呼这个脚本文件)
chmod +x runpsql
更新:
使用-w命令: psql -h localhost -p 5432 -U user -w
我发现,即使你定义了PGPASSWORD变量,psql显示密码提示,但你可以指定-w选项为psql省略密码提示。
只需使用PGPASSWORD即可完成。我使用的是psql 9.5.10。对你来说,解决办法是
PGPASSWORD=password psql -U myuser < myscript.sql
这可能是一个老问题了,但是你可以使用一个没有人提到过的替代方法。可以在连接URI中直接指定密码。文档可以在在这里或在这里中找到。
你可以在提供给psql的连接URI中直接提供你的用户名和密码:
psql
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...] psql postgresql://username:password@localhost:5432/mydb
8年后……
~/.pgpass
<IP>:<PORT>:<dbname>:<user>:<password>
使用PGPASSWORD环境变量的另一种替代方法是根据文档 . c使用conninfo字符串
conninfo
另一种指定连接参数的方法是在conninfo中 字符串或URI,用来代替数据库名称。这 . . .
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>" postgres=>
这也适用于其他postgresql cliis,例如你可以在非交互模式下运行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 &
在Windows上工作的url字符串和使用psql选项的组合:
> psql -d postgresql://username:password@localhost:5432/mydb -f myscript.sql
传递没有-d的命令没有工作,只是连接到数据库,但没有执行脚本