Alternative to list command in postgres for scripting
不幸的是
例
查看输出并查看"访问"列
1
2
3
4
5
6
7
8
9
10
11
12 List OF DATABASES
Name | Owner | Encoding | COLLATE | Ctype | Access privileges
-------------------------+------------+----------+-------------+-------------+-----------------------
firstdb | postgres | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 |
secnddb | scnduser | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 |
thrddb | scnduser | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 |
postgres | postgres | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 |
template0 | postgres | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(6 ROWS)
提示甚至有一些选择,我不能让它消失:
1
2
3
4
5
6
7
8
9 $ psql -Atlqn
firstdb|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|
secnddb|scnduser|UTF8|de_DE.UTF-8|de_DE.UTF-8|
thrddb|scnduser|UTF8|de_DE.UTF-8|de_DE.UTF-8|
postgres|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|
template0|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|=c/postgres
postgres=CTc/postgres
template1|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|=c/postgres
postgres=CTc/postgres
问题是否有另一种方法以
有趣的问题。你被ACL条目中的硬线包裹所困扰。那些不是他们可以出现的唯一的地方,只是最常见的。
使用空字节记录
而不是试图避免换行,为什么不使用不同的记录分隔符?空字节(
试试,例如:
1 2 | psql -Atlqn -0 | gawk -vRS=$'\0' '{ gsub(" ",""); print } |
它取代了数据库名称中的换行符(是的,它们可以出现在那里!),带有空格的ACL条目等。
使用不同的记录
或者,使用
自己查询目录,转义字符串
根据您需要的信息,您也可以直接查询目录或
换行符和shell元字符
请注意,您仍然需要处理意外的换行;考虑一些@#$ @执行此操作时会发生什么:
1 2 | CREATE DATABASE"my database"; |
是的,这是一个合法的数据库名称。两者都是:
1 2 3 | CREATE DATABASE"$(rm -rf /gladthisisnotroot);"; CREATE DATABASE"$(createuser -l -s my_haxxor -W top_secret)" |
是的,两者都是合法的数据库名称。是的,如果你没有正确地逃避你的shell元字符,那真是非常糟糕,你犯了以root用户身份运行shell脚本或
所有相关数据均在
见http://www.postgresql.org/docs/current/static/catalog-pg-database.html
1 | SELECT pg_database.datname,pg_user.usename,pg_encoding_to_char(pg_database.encoding),pg_database.datcollate,pg_database.datctype,pg_database.datacl FROM pg_database,pg_user WHERE pg_database.datdba = pg_user.usesysid; |
在shell上,用psql命令包装:
1 | psql -AStnq -c"select [...]" |
返回格式正确
1 2 3 4 5 6 | template1|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|{=c/postgres,postgres=CTc/postgres} template0|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8|{=c/postgres,postgres=CTc/postgres} postgres|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8| firstdb|postgres|UTF8|de_DE.UTF-8|de_DE.UTF-8| secnddb|scnduser|UTF8|de_DE.UTF-8|de_DE.UTF-8| thrddb|scnduser|UTF8|de_DE.UTF-8|de_DE.UTF-8| |