0

我有一个使用 docker-compose 运行的 postgres 10.6 容器。我尝试使用该命令创建用户,但它不起作用。

docker-compose exec kong-database psql -U postgres -c 'CREATE ROLE joe PASSWORD 'md5b5f5ba1a423792b526f799ae4eb3d59e' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;'

还,

我收到此错误

ERROR:  syntax error at or near "md5b5f5ba1a423792b526f799ae4eb3d59e"
LINE 1: CREATE ROLE joe PASSWORD md5b5f5ba1a423792b526f799ae4eb3d59e...
                                 ^

还,

docker-compose exec kong-database psql -U postgres -c 'CREATE ROLE davide LOGIN PASSWORD 'jw8s0F4' '

同样的错误,

ERROR:  syntax error at or near "jw8s0F4"
LINE 1: CREATE ROLE davide LOGIN PASSWORD jw8s0F4 
                                          ^

显然,当我不使用WITH PASSWORDPASSWORD在命令中时,它会通过。但我必须用密码保护数据库。

怎么了?

4

1 回答 1

1

在 PostgreSQL 看到它们之前,密码周围的单引号被 shell 吃掉了。你需要以某种方式逃避它们。

一种方法是使用 shell 双引号而不是单引号来引用整个命令,因为出现在双引号内的单引号并不特殊。

 psql  -c "CREATE ROLE davide2 LOGIN PASSWORD 'jw8s0F4'"

但是,如果您的密码包含 shell 双引号内的特殊字符,例如美元符号,那将是一个问题。(所以只需延长密码,并从中排除任何此类字符)

如果我通过将它们加倍来逃避它们,我仍然会得到同样的错误

双引号是您在 SQL 中转义它们的方式,但这不是您在 shell 中转义它们的方式。问题是你的单引号首先没有进入 SQL,因为 shell 吃掉了它们。

如果整个命令的 shell 双引号对您不起作用,则在 shell 中转义单引号的另一种方法是使用 backwhack。问题是单引号内的反击不能作为转义,所以你必须关闭单引号,反击单引号,然后重新打开单引号,然后在另一端重复整个过程。此外,出于测试目的,您可以替换psql -cecho,这样您就可以在不实际运行的情况下查看 shell 将传递给 psql 的内容。

echo 'CREATE ROLE davide3 LOGIN PASSWORD '\''jw8s0F4'\'' '
于 2020-05-07T12:38:13.167 回答