我正在尝试使用shell脚本自动化数据库创建过程,但在将密码传递给psql时遇到了一个障碍。
以下是来自shell脚本的一小段代码:
psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"
如何以非交互方式将密码传递给 psql
?
我正在尝试使用shell脚本自动化数据库创建过程,但在将密码传递给psql时遇到了一个障碍。
以下是来自shell脚本的一小段代码:
psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"
如何以非交互方式将密码传递给 psql
?
在调用psql之前,在脚本中设置PGPASSWORD环境变量。
PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName
参考资料,请参见http://www.postgresql.org/docs/current/static/libpq-envars.html
编辑
自从Postgres 9.2版本以后,还可以使用连接字符串或URI指定用户名和密码。语法如下:
$ psql postgresql://[user[:password]@][host][:port][,...][/dbname][?param1=value1&...]
使用该方法存在安全风险,因为通过查看运行进程的命令行(例如使用 ps
(Linux)、ProcessExplorer (Windows) 或类似工具),其他用户可以明文看到密码。
也可以参考这个关于数据库管理员问题的讨论。
docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
- Bilal Akilps -ef
)查看;2) 该密码将被添加到您Shell的历史记录文件中(例如.bash_history
)。建议将密码存储在一个安全的文件中(例如使用操作系统级别的权限来限制访问),然后运行PGPASSWORD=$(cat /<path>/to/secret.txt) ...
。 - code_dreddchmod go-rwx .pgpass
。 - Vladislavs Dovgalecs一句话概括:
export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'
使用命令,例如 "select * from schema.table"
的 SQL 命令。
或更易读的:
export PGPASSWORD='password'
psql -h 'server name' -U 'user name' -d 'base name' \
-c 'command' (eg. "select * from schema.table")
PGPASSWORD='password' psql ....
这样做的好处是在命令执行完毕后,该变量便无法被访问。 - Garrettexport PGPASSWORD=YourNewPassword
对于我来说比其他变化都有效。 - Mikeumus-w
标志也起作用了。 - Manuel Lazo在Windows上:
将值赋给PGPASSWORD: C:\>set PGPASSWORD=pass
运行命令: C:\>psql -d database -U user
准备就绪
或者在一行中:
set PGPASSWORD=pass&& psql -d database -U user
请注意 && 前面缺少空格!
-w
这个选项。 - mljrgPGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"
可以正常工作。 - Steve Shipway$env:PGPASSWORD=pass; psql -d database -U user
- Venryx可以通过在(Linux)用户的主目录中创建.pgpass
文件来实现。
.pgpass
文件格式:<databaseip>:<port>:<databasename>:<dbusername>:<password>
你也可以使用通配符*
代替细节。
假设我想在不提示密码的情况下运行tmp.sql
。
你可以在*.sh文件中使用以下代码。
echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"
echo " ` psql -h 192.168.1.1 -p 5432 -U postgres postgres -f tmp.sql `
chmod 0600 $HOME/.pgpass
"」的意义是将命令输出(echo)到终端上,以便用户确认该命令是否正确执行。而「chmod 0600 $HOME/.pgpass」则是更直接地修改文件权限。 - Vlad Patryshev使用PGPASSWORD
环境变量的替代方法是根据文档使用conninfo
字符串:
另一种指定连接参数的方法是在
conninfo
字符串或URI中,该字符串或URI用于替代数据库名称。这种机制可以极大地控制连接。
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
如果现在加入大多数选项还不算太晚:
有几个选项:
设置环境变量并从中获取:
export PGPASSWORD='password'
然后运行您的 psql 进行登录,或者甚至从那里运行命令:
psql -h clustername -U username -d testdb
在 Windows 上,您需要使用“set” :
set PGPASSWORD=pass
然后登录到 psql bash。
通过 URL 和环境变量传递:
psql "postgresql://$USER_NAME:$PASSWORD@$HOST_NAME/$DB_NAME"
为了更加清晰,补充一下。
你可以将密码赋值给PGPASSWORD
变量。
所以,取代下面需要你输入密码的方式:
psql --host=aurora-postgres.cluster-fgshdjdf.eu-west-1.rds.amazonaws.com --port=5432 --user=my_master_user --password --dbname=postgres
我们将使用PGPASSWORD=QghyumjB3ZtCQkdf
替换--password
标志。因此,它将是:
PGPASSWORD=QghyumjB3ZtCQkdf psql --host=aurora-postgres.cluster-fgshdjdf.eu-west-1.rds.amazonaws.com --port=5432 --user=my_master_user --dbname=postgres
这样您将不需要输入密码。
cat /opt/PostgreSQL/10/pg_env.sh
#!/bin/sh
# The script sets environment variables helpful for PostgreSQL
export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man
根据用户4653174的建议,增加了以下内容:
export PGPASSWORD='password'