如何调用 psql 以便它 doesn't prompt for a password ?
这就是我所拥有的:
psql -Umyuser < myscript.sql
但是,我找不到传递密码的参数,因此psql总是提示它 .
有几种方法可以对PostgreSQL进行身份验证 . 您可能希望在https://www.postgresql.org/docs/current/static/client-authentication.html调查密码验证的替代方法 .
要回答您的问题,有几种方法可以为基于密码的身份验证提供密码 . 显而易见的方法是通过密码提示 . 您可以在pgpass文件中或通过 PGPASSWORD 环境变量提供密码,而不是这样 . 看到这些:
PGPASSWORD
https://www.postgresql.org/docs/9.0/static/libpq-pgpass.html
https://www.postgresql.org/docs/9.0/interactive/libpq-envars.html
没有选项可以将密码作为命令行参数提供,因为该信息通常可供所有用户使用,因此不安全 . 但是,在Linux / Unix环境中,您可以为单个命令提供环境变量,如下所示:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
您可以在脚本开头添加此命令行:
set PGPASSWORD=[your password]
如果您打算拥有多个主机/数据库连接,那么~/.pgpass file就是您的选择 .
脚步:
创建〜/ .pgpass文件 . 使用以下格式输入您的信息hostname:port:database:username:password
不要在字段值周围添加字符串引号 . 您还可以使用*作为端口/数据库字段的通配符 .
在bash配置文件中创建一个别名,为您运行psql命令 . 例如: alias postygresy='psql --host hostname database_name -U username' 这些值应与您输入到〜/ .pgpass文件的值相匹配 .
alias postygresy='psql --host hostname database_name -U username'
来源您的bash档案 .
从命令行键入别名 .
请注意,如果您设置了导出PGPASSWORD =''变量,则它将优先于该文件 . 更改文件的权限以便从其他用户隐藏内容也是明智之举 . 这可以通过 chmod 600 ~/.pgpass 实现
chmod 600 ~/.pgpass
您必须创建密码文件:有关详细信息,请参阅http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html .
如果你're having problems on windows like me (I' m使用Windows 7 64位)和 set PGPASSWORD=[Password] 不起作用 .
set PGPASSWORD=[Password]
然后,正如Kavaklioglu在其中一条评论中所说的那样,
export PGPASSWORD=[password]
您需要将其保存在文件的顶部,或者在任何使用之前保存,以便在调用之前将其保存 .
当然可以在Windows上工作:)
鉴于使用PGPASSWORD环境变量的安全性问题,我认为最好的整体解决方案如下:
使用您要使用的密码编写自己的临时pgpass文件 .
使用PGPASSFILE环境变量告诉psql使用该文件 .
删除临时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
Build 在mightybyte's answer上的那些不熟悉* 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号附加到文件名,这样该脚本可以多次运行,甚至可以同时运行,没有副作用 .
/tmp/pgpasswd$$
$$
注意在第4行使用 chmod 命令 - 就像 mightybyte 描述的“非普通文件”错误一样,如果不这样做,也会出现“权限”错误 .
chmod
在第6行,如果使用默认值(localhost:5432)并且只有一个数据库用户,则不必使用 -h myserver, -p myport或 -U jdoe标志 . 对于多个用户,(但默认连接)将该行更改为
-h
-p
-U
psql mydb jdoe
不要忘记使脚本可执行
chmod x runpsql(或者你称之为脚本文件的任何东西)
它可以简单地使用PGPASSWORD完成 . 我正在使用psql 9.5.10 . 在你的情况下,解决方案将是
PGPASSWORD=password psql -U myuser < myscript.sql
您可能会觉得这很有用:Windows PSQL command line: is there a way to allow for passwordless login?
这可能是一个老问题,但有可能直接在连接URI中指定密码 . 文档可以在here找到,或者here .
您可以直接在提供给 psql 的连接URI中提供您的用户名和密码:
psql
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...] psql postgresql://username:password@localhost:5433/mydb
我发现,即使您定义了PGPASSWORD变量,psql显示密码提示,但您可以为psql指定-w选项以省略密码提示 .
在命令中使用-w:psql -h localhost -p 5432 -U user -w
13 回答
有几种方法可以对PostgreSQL进行身份验证 . 您可能希望在https://www.postgresql.org/docs/current/static/client-authentication.html调查密码验证的替代方法 .
要回答您的问题,有几种方法可以为基于密码的身份验证提供密码 . 显而易见的方法是通过密码提示 . 您可以在pgpass文件中或通过
PGPASSWORD
环境变量提供密码,而不是这样 . 看到这些:https://www.postgresql.org/docs/9.0/static/libpq-pgpass.html
https://www.postgresql.org/docs/9.0/interactive/libpq-envars.html
没有选项可以将密码作为命令行参数提供,因为该信息通常可供所有用户使用,因此不安全 . 但是,在Linux / Unix环境中,您可以为单个命令提供环境变量,如下所示:
您可以在脚本开头添加此命令行:
如果您打算拥有多个主机/数据库连接,那么~/.pgpass file就是您的选择 .
脚步:
创建〜/ .pgpass文件 . 使用以下格式输入您的信息hostname:port:database:username:password
不要在字段值周围添加字符串引号 . 您还可以使用*作为端口/数据库字段的通配符 .
在bash配置文件中创建一个别名,为您运行psql命令 . 例如:
alias postygresy='psql --host hostname database_name -U username'
这些值应与您输入到〜/ .pgpass文件的值相匹配 .来源您的bash档案 .
从命令行键入别名 .
请注意,如果您设置了导出PGPASSWORD =''变量,则它将优先于该文件 . 更改文件的权限以便从其他用户隐藏内容也是明智之举 . 这可以通过
chmod 600 ~/.pgpass
实现您必须创建密码文件:有关详细信息,请参阅http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html .
如果你're having problems on windows like me (I' m使用Windows 7 64位)和
set PGPASSWORD=[Password]
不起作用 .然后,正如Kavaklioglu在其中一条评论中所说的那样,
您需要将其保存在文件的顶部,或者在任何使用之前保存,以便在调用之前将其保存 .
当然可以在Windows上工作:)
鉴于使用PGPASSWORD环境变量的安全性问题,我认为最好的整体解决方案如下:
使用您要使用的密码编写自己的临时pgpass文件 .
使用PGPASSFILE环境变量告诉psql使用该文件 .
删除临时pgpass文件
这里有几点值得注意 . 第1步是为了避免与用户可能存在的〜/ .pgpass文件混淆 . 您还必须确保该文件具有0600或更低的权限 .
有人建议利用bash来快捷方式如下:
这使用<()语法来避免需要将数据写入实际文件 . 但它不起作用,因为psql检查正在使用的文件,并将抛出这样的错误:
Build 在mightybyte's answer上的那些不熟悉* nix shell脚本的人,这是一个工作脚本:
第2行
/tmp/pgpasswd$$
中的双美元符号($$
)将进程ID号附加到文件名,这样该脚本可以多次运行,甚至可以同时运行,没有副作用 .注意在第4行使用
chmod
命令 - 就像 mightybyte 描述的“非普通文件”错误一样,如果不这样做,也会出现“权限”错误 .在第6行,如果使用默认值(localhost:5432)并且只有一个数据库用户,则不必使用
-h
myserver,-p
myport或-U
jdoe标志 . 对于多个用户,(但默认连接)将该行更改为不要忘记使脚本可执行
它可以简单地使用PGPASSWORD完成 . 我正在使用psql 9.5.10 . 在你的情况下,解决方案将是
PGPASSWORD=password psql -U myuser < myscript.sql
您可能会觉得这很有用:Windows PSQL command line: is there a way to allow for passwordless login?
这可能是一个老问题,但有可能直接在连接URI中指定密码 . 文档可以在here找到,或者here .
您可以直接在提供给
psql
的连接URI中提供您的用户名和密码:我发现,即使您定义了PGPASSWORD变量,psql显示密码提示,但您可以为psql指定-w选项以省略密码提示 .
在命令中使用-w:psql -h localhost -p 5432 -U user -w