Postgresql:使用密码脚本执行psql执行
我怎样才能调用psql ,使其不提示input密码 ?
这是我的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,所以psql总是提示input密码。
有几种方法来validationpostgresql。 您可能希望在http://www.postgresql.org/docs/current/static/client-authentication.html上调查密码authentication的替代scheme。;
要回答你的问题,有几种方法提供基于密码的authentication的密码。 显而易见的方法是通过密码提示。 除此之外,您可以在pgpass文件中或通过PGPASSWORD环境variables提供密码。 看到这些:
http://www.postgresql.org/docs/9.0/static/libpq-pgpass.html http://www.postgresql.org/docs/9.0/interactive/libpq-envars.html
没有选项将密码作为命令行参数提供,因为该信息通常对所有用户可用,因此不安全。 但是,在Linux / Unix环境中,您可以为单个命令提供一个环境variables,如下所示:
PGPASSWORD = yourpass psql …
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
您可以在脚本开始时添加这个命令行:
set PGPASSWORD=[your password]
如果你打算有多个主机/数据库连接, 〜/ .pgpass文件是要走的路。
脚步:
- 创build〜/ .pgpass文件。 以下列格式input您的信息hostname:port:database:username:password
- 不要在字段值周围添加string引号。 您也可以使用*作为端口/数据库字段的通配符。
- 在您的bashconfiguration文件中为您运行psql命令创build一个别名。 例如:
alias postygresy='psql --host hostname database_name -U username'
这些值应该与您input到〜/ .pgpass文件的值相匹配。 - 源你的bashconfiguration文件。
- 从命令行键入您的别名。
请注意,如果您有一个导出PGPASSWORD =''variables集,它将优先于该文件。 更改文件的权限也是明智的,这样内容就会被其他用户遮住了。 这可以通过chmod 600 ~/.pgpass
来实现
您必须创build密码文件:有关更多信息,请参阅http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html 。
如果你像我这样的Windows(我正在使用Windows 7 64位)有问题,并set PGPASSWORD=[Password]
不起作用。
然后,正如Kavaklioglu在其中一个评论中所说:
export PGPASSWORD=[password]
您需要将其保存在文件的顶部,或者在调用之前设置其使用之前。
当然在Windows上工作:)
考虑到使用PGPASSWORD环境variables的安全问题,我认为最好的整体解决scheme如下:
- 用你想使用的密码写你自己的临时pgpass文件。
- 使用PGPASSFILE环境variables来告诉psql使用该文件。
- 删除临时的pgpass文件
这里有几点需要注意。 第1步是为了避免用户的〜/ .pgpass文件可能存在。 您还必须确保该文件的权限为0600或更less。
有人build议利用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
您可能会觉得这很有用: Windows PSQL命令行:有没有办法允许无密码login?
基于mightybyte对那些不熟悉* nix shell脚本的人的回答 ,下面是一个工作脚本:
#!/bin/sh PGPASSFILE=/tmp/pgpasswd$$ echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE chmod 600 $PGPASSFILE export PGPASSFILE psql mydb rm $PGPASSFILE
第2行的/tmp/pgpasswd$$
中的双美元符号( $$
)将进程ID号附加到文件名,以便此脚本可以多次运行,即使同时运行也没有副作用。
请注意在第4行使用chmod
命令 – 就像可能描述的“ 不是纯文件 ”错误一样,如果没有完成,也会出现“ 许可 ”错误。
在第6行,如果使用默认值( localhost : 5432 ),则不必使用-h
myserver , -p
myport或-U
jdoe标志,只有一个数据库用户。 对于多个用户,(但默认连接)将该行更改为
psql mydb jdoe
不要忘记使脚本可执行
chmod +x runpsql
( 或者你所说的脚本文件 )
我发现,即使你定义了PGPASSWORDvariables,psql也显示密码提示符,但是你可以指定psql的-w选项来省略密码提示。
在命令中使用-w:psql -h localhost -p 5432 -U用户-w