Postgresql:使用密码执行psql脚本

如何调用psql使其不会提示输入密码?

这是我所拥有的:

psql -Umyuser < myscript.sql

但是,我找不到传递密码的参数,所以psql总是提示输入这个参数。

398143 次浏览

你必须创建一个密码文件:参见http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html获取更多信息。

你可能希望阅读向PostgreSQL进行身份验证的方法的摘要。

为了回答你的问题,有几种方法为基于密码的身份验证提供密码:

  1. < p > 通过密码提示。例子:

    psql -h uta.biocommons.org -U foo
    Password for user foo:
    
  2. < p > 在pgpass文件中。看到libpq-pgpass。格式:

    <host>:<port>:<database>:<user>:<password>
    
  3. < p > 使用PGPASSWORD环境变量。看到libpq-envars。例子:

    export PGPASSWORD=yourpass
    psql ...
    
    
    # Or in one line for this invocation only:
    PGPASSWORD=yourpass psql ...
    
  4. 在连接字符串中密码和其他选项可以在连接字符串/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]不工作。

然后,正如Kavaklioglu在其中一条评论中所说,

export PGPASSWORD=[password]

您需要将其保存在文件的顶部,或者在任何使用之前,以便在调用之前设置它。

当然可以在windows上工作:)

考虑到使用PGPASSWORD环境变量的安全问题,我认为最佳的整体解决方案如下:

  1. 用您想使用的密码编写自己的临时pgpass文件。
  2. 使用PGPASSFILE环境变量告诉psql使用该文件。
  3. 删除临时pgpass文件

这里有几点需要注意。步骤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文件是正确的方法。

步骤:

  1. 使用vim ~/.pgpass或类似方法创建文件。请按以下格式输入您的资料: 不要在字段值周围添加字符串引号。你也可以使用*作为端口/数据库字段的通配符
  2. 你必须chmod 0600 ~/.pgpass,以便它不会被psql默默地忽略。
  3. 在bash概要文件中创建一个别名,该别名为您运行psql命令。例如:alias postygresy='psql --host hostname database_name -U username'这些值应该与你输入到~/。pgpass文件。
  4. 使用. ~/.bashrc或类似的方法来获取你的bash配置文件。
  5. 从命令行输入别名。

注意,如果设置了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号附加到文件名,因此该脚本可以多次运行,甚至同时运行,而不会产生副作用。

注意在第4行使用chmod命令——就像mightybyte描述的“不是普通文件”错误一样,如果不这样做,也会出现“权限”错误。

在第7行,如果你使用默认值(本地主机: 5432)并且只有一个数据库用户,你将不必使用-hmyserver-pmyport-Ujdoe标志。对于多个用户,(但默认连接)将该行更改为

psql mydb jdoe

不要忘记使脚本可执行的 with

chmod +x runpsql (或者不管你怎么称呼这个脚本文件)

更新:

我采纳了RichVel的建议,并将密码放入其中,使文件不可读。这就弥补了一个小小的安全漏洞。 谢谢!< / p >

使用-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中直接提供你的用户名和密码:

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb

8年后……

在我的mac上,我必须在文件中放入一行 ~/.pgpass: < / p >
<IP>:<PORT>:<dbname>:<user>:<password>
< p >也看到:< br > https://www.postgresql.org/docs/current/libpq-pgpass.html < br > https://wiki.postgresql.org/wiki/Pgpass < / p >

使用PGPASSWORD环境变量的另一种替代方法是根据文档 . c使用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的命令没有工作,只是连接到数据库,但没有执行脚本