Bash shell 连接到数据库,运行 来自 PSQL 的查询给出了未知用户:
Bash shell to connect to a DB and run a query from in PSQL gives an unknown user:
我正在尝试 运行 从 shell 一个命令,而不实际切换用户或手动登录数据库(因此 shell 不会被打断询问密码)
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;\""
到这里一切都很好,但是当尝试将票务数据库连接到单行中以自动执行此操作时,它根本不起作用,在 运行ning
之后
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
然而,这会阻止 shell 表格实际生成 "automatic"
欢迎来到反斜杠地狱!您需要在 uuid-ossp
周围的 double-quote 前添加三个反斜杠以获得正确的输出:
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;"
您有点引用不当。最里面的引号未转义并将消失。加入一些单引号:
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__
我正在尝试 运行 从 shell 一个命令,而不实际切换用户或手动登录数据库(因此 shell 不会被打断询问密码)
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;\""
到这里一切都很好,但是当尝试将票务数据库连接到单行中以自动执行此操作时,它根本不起作用,在 运行ning
之后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
然而,这会阻止 shell 表格实际生成 "automatic"
欢迎来到反斜杠地狱!您需要在 uuid-ossp
周围的 double-quote 前添加三个反斜杠以获得正确的输出:
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;"
您有点引用不当。最里面的引号未转义并将消失。加入一些单引号:
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__