首页 > 解决方案 > 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

我在哪里做错了?

标签: bashpostgresqlscriptingvagrantpostgis

解决方案


您的问题是您正在使用postgres用户无法访问的工作目录执行命令。事实上,它是执行命令的用户的主目录 ( vagrant)。

解决此问题的方法有以下三种:

  1. 使用--login(或-i简称)选项sudo
    这将导致sudo使用类似于登录 shell 的设置执行命令。
    特别是这将(尝试)更改为目标用户的主目录作为工作目录。

  2. 使用更改脚本中的工作目录cd ~postgres
    这将导致所有 sudo 命令将在那里执行。

  3. 允许用户postgres访问用户的主目录vagrant
    这是危险的,绝对不推荐!!!
    我只是为了完整性而提到它。
    如果您需要定期进行此类访问,并且您手头有一些细粒度的访问控制(例如 ACL) ,这可能是一个选项
    ,可以确保postgres确实是唯一被授予访问权限的用户。即使那样你也应该三思而后行!在大多数情况下,选择 1. 或 2. 是首选。


推荐阅读