PostgreSQL: выполнить запрос из скрипта - PullRequest
0 голосов
/ 24 февраля 2019

Я устанавливаю PostgreSQL + POSTGIS на виртуальную машину CentOS 7 с использованием Vagrant и Virtual Box.

Мой Vagtantfile следующий ...

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 установлен и работает.

Чтобы добавить POSTGIS при моей установке PostgreSQL, в интерактивном режиме я использую эту процедуру

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

Где я не так делаю?

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Я решил таким образом ...

sudo su postgres
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"
0 голосов
/ 25 февраля 2019

Ваша проблема в том, что вы выполняете команды с рабочим каталогом, который недоступен для пользователя postgres.Фактически это домашний каталог пользователя, выполняющего команды (vagrant).

Существует три подхода к решению этой проблемы:

  1. use --login(или -i для краткости) опция sudo
    Это заставит sudo выполнить команды с настройками, подобными оболочке входа в систему.
    Особенно это (попытка) изменится на домашний каталог целевого пользователяв качестве рабочего каталога.

  2. измените рабочий каталог в вашем скрипте, используя cd ~postgres
    Это приведет к тому, что все команды sudo будут выполняться там.

  3. Разрешить пользователю postgres доступ к домашнему каталогу пользователя vagrant
    ЭТО ОПАСНО И АБСОЛЮТНО НЕ РЕКОМЕНДУЕТСЯ !!!
    Я просто упоминаю это для полноты.Это может быть вариант, если вам нужен такой доступ регулярно
    , и у вас под рукой есть некоторый точный контроль доступа (например, ACL)
    , который позволяет гарантировать, что postgres действительно является единственным пользователем, которому предоставлен доступ.Даже тогда вы должны думать трижды!В большинстве случаев предпочтительнее варианты 1. или 2.

...