通过 Bash psql 从 postgresql 数据库使用 `select ...pgp_sym_decrypt ()` 时合并的列
Columns combined when using `select ...pgp_sym_decrypt ()` from postgresql databse through Bash psql
系统是 Debian 11.2 和 PostgreSQL 11.5。
我创建了一个数据库,table如下:
CREATE DATABASE dbname OWNER=postgres
ENCODING= 'UTF8'
\c dbname
CREATE TABLE test(
id serial primary key,
site varchar(100) NOT NULL,
username char(30) NOT NULL,
password char(300) NOT NULL,
note varchar(200) DEFAULT NULL
);
创建 bash 文件如下:
#!/bin/bash
res_user='me'
db_user='postgres'
db_name='dbname'
table_name='test'
sym_key='key'
#insert 4 columns
su $db_user <<EOFU
psql -d "$db_name" -U "$db_user" << EOF
INSERT INTO $table_name (site,username,password,note) VALUES ('v4','u3',pgp_sym_encrypt('password','key','cipher-algo=aes128,compress-algo=0,convert-crlf=1,sess-key=0,s2k-mode=3'),'note3');
EOF
EOFU
#column note has no output
password_arr=($(su $db_user <<EOFU
psql -tAq --field-separator= -d "$db_name" -U "$db_user" << EOF
SELECT "username",pgp_sym_decrypt(password::bytea,'key'),"note" FROM "$table_name" WHERE "site" LIKE '%v4%';
EOF
EOFU
))
echo "${password_arr[1]}" #output is passwordnote3
echo "${password_arr[2]}" #no ouput?
预期输出是:
${password_arr[1]} is `password`
${password_arr[2]} is `note3`
运行上面的bash脚本,但是输出"${password_arr[2]}"
没有值,"${password_arr[1]}"
是passwordnote3
。问题出在哪里?
我发现了问题。问题是您将 --field-separator
指定为“无”而不是 space。应该是--field-separator=" "
。这允许 pgp_sym_decrypt()
的输出与 note
连接。然而,用户名字段总是有 spaces,可能是因为它的固定宽度为 30。
我还建议您将行输出数减少到 1,并在依赖分词时启用“noglob”选项。这可以用 set -f
来完成。您还可以使用 read
来获取所需的字段。参见 How to split a string into an array in Bash?。
系统是 Debian 11.2 和 PostgreSQL 11.5。
我创建了一个数据库,table如下:
CREATE DATABASE dbname OWNER=postgres
ENCODING= 'UTF8'
\c dbname
CREATE TABLE test(
id serial primary key,
site varchar(100) NOT NULL,
username char(30) NOT NULL,
password char(300) NOT NULL,
note varchar(200) DEFAULT NULL
);
创建 bash 文件如下:
#!/bin/bash
res_user='me'
db_user='postgres'
db_name='dbname'
table_name='test'
sym_key='key'
#insert 4 columns
su $db_user <<EOFU
psql -d "$db_name" -U "$db_user" << EOF
INSERT INTO $table_name (site,username,password,note) VALUES ('v4','u3',pgp_sym_encrypt('password','key','cipher-algo=aes128,compress-algo=0,convert-crlf=1,sess-key=0,s2k-mode=3'),'note3');
EOF
EOFU
#column note has no output
password_arr=($(su $db_user <<EOFU
psql -tAq --field-separator= -d "$db_name" -U "$db_user" << EOF
SELECT "username",pgp_sym_decrypt(password::bytea,'key'),"note" FROM "$table_name" WHERE "site" LIKE '%v4%';
EOF
EOFU
))
echo "${password_arr[1]}" #output is passwordnote3
echo "${password_arr[2]}" #no ouput?
预期输出是:
${password_arr[1]} is `password`
${password_arr[2]} is `note3`
运行上面的bash脚本,但是输出"${password_arr[2]}"
没有值,"${password_arr[1]}"
是passwordnote3
。问题出在哪里?
我发现了问题。问题是您将 --field-separator
指定为“无”而不是 space。应该是--field-separator=" "
。这允许 pgp_sym_decrypt()
的输出与 note
连接。然而,用户名字段总是有 spaces,可能是因为它的固定宽度为 30。
我还建议您将行输出数减少到 1,并在依赖分词时启用“noglob”选项。这可以用 set -f
来完成。您还可以使用 read
来获取所需的字段。参见 How to split a string into an array in Bash?。