bash - PostgreSQL:从脚本执行查询
问题描述
我正在使用 Vagrant 和 Virtual Box 在 CentOS 7 虚拟机上安装 PostgreSQL + POSTGIS。
我的 Vagantfile 如下...
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.network "private_network", ip: "192.168.56.2"
config.vm.provider "virtualbox" do |vb|
vb.memory = "4096"
vb.name = "Test"
end
config.vm.provision "shell", path: "./scripts/InstallPostgresqlPostgis.sh"
end
其中./scripts/InstallPostgresqlPostgis.sh
包含安装 PostgreSQL 的所有命令,并且在运行时,PostgreSQL 已安装并可以运行。
要以交互方式在我的 PostgreSQL 安装中添加 POSTGIS,我使用此过程
su postgres
----->>>>>>> HERE I'VE TO PUT THE USER PASSWORD <<<<<<<-------
psql
-- Enable PostGIS (includes raster)
CREATE EXTENSION postgis;
-- Enable Topology
CREATE EXTENSION postgis_topology;
-- Enable PostGIS Advanced 3D
-- and other geoprocessing algorithms
-- sfcgal not available with all distributions
CREATE EXTENSION postgis_sfcgal;
-- fuzzy matching needed for Tiger
CREATE EXTENSION fuzzystrmatch;
-- rule based standardizer
CREATE EXTENSION address_standardizer;
-- example rule data set
CREATE EXTENSION address_standardizer_data_us;
-- Enable US Tiger Geocoder
CREATE EXTENSION postgis_tiger_geocoder;
\q
和所有的作品。
我必须InstallPostgresqlPostgis.sh
在我的 Vagrantfile 中“翻译”这个过程,我已经尝试过了
sudo -u postgres -H -- psql -d postgres -c "CREATE EXTENSION postgis"
sudo -u postgres -H -- psql -d postgres -c "CREATE EXTENSION postgis_topology"
sudo -u postgres -H -- psql -d postgres -c "CREATE EXTENSION postgis_sfcgal"
sudo -u postgres -H -- psql -d postgres -c "CREATE EXTENSION fuzzystrmatch"
sudo -u postgres -H -- psql -d postgres -c "CREATE EXTENSION address_standardizer"
sudo -u postgres -H -- psql -d postgres -c "CREATE EXTENSION address_standardizer_data_us"
sudo -u postgres -H -- psql -d postgres -c "CREATE EXTENSION postgis_tiger_geocoder"
但结果是……
default: could not change directory to "/home/vagrant": Permission denied
default: CREATE EXTENSION
default: could not change directory to "/home/vagrant": Permission denied
default: CREATE EXTENSION
default: could not change directory to "/home/vagrant": Permission denied
default: CREATE EXTENSION
default: could not change directory to "/home/vagrant": Permission denied
default: CREATE EXTENSION
default: could not change directory to "/home/vagrant": Permission denied
default: CREATE EXTENSION
default: could not change directory to "/home/vagrant": Permission denied
default: CREATE EXTENSION
default: could not change directory to "/home/vagrant": Permission denied
default: CREATE EXTENSION
我在哪里做错了?
解决方案
您的问题是您正在使用postgres
用户无法访问的工作目录执行命令。事实上,它是执行命令的用户的主目录 ( vagrant
)。
解决此问题的方法有以下三种:
使用
--login
(或-i
简称)选项sudo
这将导致sudo
使用类似于登录 shell 的设置执行命令。
特别是这将(尝试)更改为目标用户的主目录作为工作目录。使用更改脚本中的工作目录
cd ~postgres
这将导致所有 sudo 命令将在那里执行。允许用户
postgres
访问用户的主目录vagrant
这是危险的,绝对不推荐!!!
我只是为了完整性而提到它。
如果您需要定期进行此类访问,并且您手头有一些细粒度的访问控制(例如 ACL) ,这可能是一个选项
,可以确保postgres
确实是唯一被授予访问权限的用户。即使那样你也应该三思而后行!在大多数情况下,选择 1. 或 2. 是首选。
推荐阅读
- c++ - 类模板中嵌套类的 C++ Friend 函数
- apache-kafka - 使用flafka从数据源到HDFS的相同文本文件
- reactjs - 当用户专注于输入以及失去焦点时,我如何捕捉并做某事?
- c - 在内存阵列中挑选一对位 (0b11)
- c - 有人可以简化下面的代码结构 {int a[2];} arr[] = {{1},{2}}; 吗?
- javascript - d3js - 如何在简单的 d3 折线图中更新现有的 svg 路径,新数据流过?
- csv - 输出缓冲区未在 for 循环中清除
- angular - 使用谷歌日历 API 同步 Angular - .NET 应用程序
- html - CSS媒体查询读取错误的宽度
- java - 如何使用网站建议自动完成 EditText?