如何从WSL连接到Windows Postgres数据库

时间:2019-06-30 12:19:20

标签: postgresql windows-subsystem-for-linux

我在Windows计算机上运行Postgres 11服务。 如何从wsl连接到此数据库?

已尝试: su-postgres

postgres@LAPTOP-NQ52TKOG:~$ psql 
psql: could not connect to server: No such file or directory 
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"

尝试连接WSL Postgres,我不想使用以下命令运行Ubuntu Postgres: sudo /etc/init.d/postgresql start

5 个答案:

答案 0 :(得分:3)

在WSL2中,您需要使用主机IP进行连接

获取主机IP

cat /etc/hosts | grep 172.; test $? -eq 0 && $1 || echo -e "$(grep nameserver /etc/resolv.conf | awk '{print $2, " host"}')\n$(cat /etc/hosts)" | sudo tee /etc/hosts

然后,您需要在“具有高级安全性的Windows Defender防火墙”中允许TCP 5432入站规则


我做了我自己的PS。您仍然需要在防火墙中允许TCP 5432

将此内容放入〜/ .bashrc

psql -h host -p 5432 -U postgres

将主机IP附加到/ etc / hosts(如果以前不存在)(通常在重新启动wsl或计算机时发生)

然后

{{1}}

答案 1 :(得分:2)

WSL2 动态分配 IP 地址,甚至无需重新启动 Windows 即可更改 IP 地址。因此,为了可靠地连接,我们需要:

  1. 允许 Windows 和 Postgres 接受来自 WSL2 IP 地址范围的连接(默认情况下不允许)
  2. 通过 psql 连接时,从 WSL2 确定 Windows/Postgresql 主机的 IP 地址(动态)。我们将通过 .bashrcalias 为您提供便利。

不幸的是,我找不到 WSL2 IP 地址范围的确切规范。从几次测试/重启来看,WSL2 似乎正在分配 172.*.*.* 范围内的 IP 地址,因此我们将在配置防火墙和 Postgres 时使用它。

为 WSL2 IP 地址添加 Windows 防火墙入站端口规则:

  1. 打开Windows Defender Firewall with Advanced Security
  2. 点击New Rule...
  3. 为规则类型选择 Port
  4. 选择 TCP 并为 Specific local ports 输入 5432
  5. 选择Allow the connection。从 WSL2 连接不安全,所以不要选择安全选项
  6. 至少选择 Public。也可以选择 DomainPrivate。我只能在选择 Public 时连接
  7. 为规则命名,例如Postgres - connect from WSL2 并创建它
  8. 右键单击新创建的规则并选择 Properties,然后单击 Scope 标签
  9. Remote IP address 下,选择 These IP addresses,然后单击 Add... 并输入范围 172.0.0.1172.254.254.254 并应用更改
  10. 确保规则已启用

配置 Postgres 以接受来自 WSL2 IP 地址的连接

假设 Postgresql for Windows 的默认安装/设置以下文件位于 C:\Program Files\PostgresSQL\$VERSION\data

验证 postgresql.conf 是否具有以下集合:

listen_addresses = '*'

这应该已经设置为 '*' 所以这里什么都不做。

更新 pg_hba.conf 以允许来自 WSL2 范围的连接,例如:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             172.0.0.0/8             md5

重新启动 Postgres 以使更改生效。这可以通过 Windows Services 应用程序或具有管理员权限的 cmd 完成,例如对于 PostgreSQL 12:

net stop postgresql-x64-12
net start postgresql-x64-12

WSL Shell 便利

在 WSL 中,将以下内容添加到您的 ~/.bashrc 或类似内容中:

# Add DNS entry for Windows host
if ! $(cat /etc/hosts | grep -q 'winhost'); then
  echo 'Adding DNS entry for Windows host in /etc/hosts'
  echo '\n# Windows host - added via ~/.bashhrc' | sudo tee -a /etc/hosts
  echo -e "$(grep nameserver /etc/resolv.conf | awk '{print $2, "   winhost"}')" | sudo tee -a /etc/hosts
fi

然后重新加载您的 .bashrc 更改:source ~/.bashrc

使用

psql -h winhost -p 5432 -U postgres

答案 2 :(得分:1)

明确指定主机,端口和用户名 例如:

psql -h 127.0.0.1 -p 5432 -U postgres

答案 3 :(得分:0)

您需要先确保运行

sudo service postgresql start

由于postgres服务器将运行,因此您将能够连接。

答案 4 :(得分:0)

对我来说,遵循以下步骤是可行的:

  • 更改pg_hba.conf以在所有接口上进行监听:host all all 0.0.0.0/0 trust
  • 为Postgresql打开防火墙
  • 使用/etc/hosts中指向我主机IP的主机名之一。我的主机名是:host.docker.internal