连接到数据库并在PSQL中运行查询的Bash Shell提供了一个未知用户:

时间:2019-05-07 00:36:11

标签: bash shell ubuntu psql

我正在尝试从外壳运行命令,而无需实际切换用户或手动登录数据库(因此外壳不会因询问密码而中断)

CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;

我希望我在数据库中运行的东西叫做带用户ticketng的票务

我已经设置了.pgpass文件并可以正常工作,并且已经创建了psql DB用户票证

sudo -H -u postgres bash -c "cd && psql -c \"CREATE ROLE ticketing LOGIN CREATEDB;\""
sudo -H -u postgres bash -c "cd && psql -c \"ALTER USER ticketing WITH PASSWORD 'testpass';\""
sudo -H -u postgres bash -c "cd && psql -c \"CREATE DATABASE ticketing WITH ENCODING='UTF8' OWNER=ticketing CONNECTION LIMIT=-1;\""
sudo -H -u postgres bash -c "cd && psql -c \"ALTER USER ticketing WITH SUPERUSER;\""

到目前为止,一切都很好,但是当尝试将票务数据库连接到一行以使其自动化时,运行

后,它根本无法正常工作
sudo -H -u ticketing bash -c "cd && psql -c \"CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;\""

我得到一个:

sudo:未知用户:票务

sudo:无法初始化策略插件

我要实现的目标可以通过手动运行以下几行来完成

psql -h localhost -U ticketing
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;
\q

但是这会阻止外壳形式实际上“自动”出现

2 个答案:

答案 0 :(得分:0)

欢迎来到反斜杠地狱!您需要在uuid-ossp周围的双引号前面加上三个反斜杠,以获得正确的输出:

sudo -H -u ticketing bash -c "cd && psql -c \"CREATE EXTENSION IF NOT EXISTS \\\"uuid-ossp\\\" WITH SCHEMA public;\""

因为:

bash-3.2$ echo "cd && psql -c \"CREATE EXTENSION IF NOT EXISTS \\\"uuid-ossp\\\" WITH SCHEMA public;\""

cd && psql -c "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\" WITH SCHEMA public;"

答案 1 :(得分:0)

您有点引述地狱。最内层的引号不会转义,并且会消失。将一些单引号添加到组合中:

sudo -H -u ticketing bash -c "cd && psql -c 'CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\" WITH SCHEMA public;'"
# ...........................1..............2...............................3...........3....................21

或使用非常整洁的heredoc:

sudo -H -u ticketing bash <<__END__
cd && psql -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;'
__END__