Bash PostgreSQL:从脚本执行查询

Bash PostgreSQL:从脚本执行查询,bash,postgresql,scripting,vagrant,postgis,Bash,Postgresql,Scripting,Vagrant,Postgis,我正在使用Vagrant和virtual Box在CentOS 7虚拟机上安装PostgreSQL+POSTGIS 我的流浪文件如下 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 = "

我正在使用Vagrant和virtual Box在CentOS 7虚拟机上安装PostgreSQL+POSTGIS

我的流浪文件如下

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 
但结果是

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。是首选


  • 我就这样解决了

    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"
    

    这听起来像是从当前工作目录(/home/vagrant)执行命令(sudo…),postgres用户无法访问该目录。你可能想检查一下……可能是。。。。当我执行shell脚本时,我在
    /home/vagrant
    目录中,该目录是用户
    vagrant
    的主目录。。。。我已经看到用户
    postgres
    的主目录是
    /var/lib/pgsql
    。。。。你知道我如何在shell脚本中更改目录或更改用户(同时修改我的方法…)吗?
    -I
    选项在脚本中对我非常有用。例如,有一行代码运行得很好,当我提供一个本地开发虚拟机时,我给了postgres用户一个密码,比如so
    sudo-u postgres-I psql-u postgres-d postgres-c“使用密码更改用户postgres;”“
    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"