我正在尝试在 Ubuntu 22.04 上的 bash 中将密码传递给 Postgres 数据库。像这样:
export PGPASSWORD=postgrespw
当我尝试在这样的应用程序中使用它们时:
(例如 cjdb,一个处理上传到 PostgreSQL 数据库的程序,https://github.com/cityjson/cjdb:
密码可以在PGPASSWORD环境变量中指定。如果未指定,应用程序将提示输入密码。
)
cjdb import -H localhost -U postgres -d test -s cjdb -f src/cjdb/LoD2_326625712.jsonl
或者像这样: (martin,一个也在 PostgreSQL db 上处理一些数据库功能的程序)
martin --config config.yaml
我总是收到“缺少密码”。
直接使用 psql 会奇怪地工作:
psql -U postgres testcjdb -h localhost
上述两个程序都明确声明它们支持使用环境变量 PGPASSWORD
我怎样才能确定这是程序错误(我有点不相信),还是我的 bash 终端出了问题?
如果不是程序的错,你写的PR就不会起作用; PR 解决了问题这一事实本身就证明环境变量正在传递给程序,但程序忽略它(就好像变量没有传递一样,
'PGPASSWORD' in os.environ
将是错误的)。
进一步意味着您可以证明这一点令您满意:
给定正在运行的程序的 PID,您可以从
/proc/PID/environ
读取为该程序定义的以 NUL 分隔的环境变量流。使用 tr '\0' '\n'
将 NUL 分隔符更改为换行符,以便于人类阅读,或确保 每个 变量都可读地打印:
#!/usr/bin/env bash
(( $# )) || { echo "Usage: $0 pid [pid2] ..." >&2; exit 1; }
for pid in "$@"; do
while IFS= read -r -d '' entry; do
var=${entry%%=*}
value=${entry#*=}
printf '%s=%q\n' "$var" "$value"
done <"/proc/$pid/environ"
done
...可以传递 PID(或它们的列表),并且将以可打印的形式转储环境变量的值,即使它们包含换行符或其他非打印字符。
在 shell 中,如果未导出字符串类型变量,
declare -p varname
将发出 declare -- varname=...
(数组将有 declare -a
、整数 declare -i
、名称变量 declare -n
等);或 declare -x varname=...
如果是(或者如果根本没有设置变量,则写入错误)。