我在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
6条答案
按热度按时间mu0hgdu01#
WSL 2动态地将IP地址分配给Windows主机,IP地址甚至可以在不重新启动Windows的情况下更改(参见下面的注解)。因此,为了可靠地连接,我们需要:
1.允许Windows和Postgres接受来自WSL 2 IP地址范围的连接(默认情况下不允许)
1.在WSL 2中,确定通过
psql
连接时Windows/PostgreSQL主机的IP地址(动态)。我们将通过.bashrc
和alias
来方便地实现这一点。不幸的是,我找不到WSL 2 IP地址范围的确切规范。从几次测试/重启来看,WSL 2分配的IP地址主要在
172.*.*.*
范围内,但我偶尔会分配192.*.*.*
,因此我们将在配置防火墙和Postgres时使用这些。为WSL 2 IP路由器添加Windows防火墙端口规则:
1.打开
Windows Defender Firewall with Advanced Security
1.点击
New Rule...
1.选择
Port
作为规则类型1.选择
TCP
,对于Specific local ports
,输入5432
1.选择
Allow the connection
。从WSL 2连接将不安全,因此不要选择安全选项1.至少选择
Public
。也可以选择Domain
和Private
。我只能在选择Public
的情况下连接1.命名规则,例如。
Postgres - connect from WSL2
并创建它1.右键单击新创建的规则并选择
Properties
,然后单击Scope
选项卡1.在
Remote IP address
下,选择These IP addresses
,然后单击Add...
并输入范围172.0.0.1
到172.254.254.254
1.对IP地址范围
192.0.0.1
到192.254.254.254
重复步骤91.单击
Apply
,然后单击OK
1.确保已启用规则
配置Postgres以接受来自WSL 2 IP路由器的连接
假设PostgreSQL for Windows的默认安装/设置,以下文件位于
C:\Program Files\PostgresSQL\$VERSION\data
下验证
postgresql.conf
是否具有以下设置:这应该已经被设置为
'*'
,所以这里什么也不做。更新
pg_hba.conf
以允许来自WSL 2范围的连接,例如Postgresl 12:对于PostgreSQL 13+,您应该使用
scram-sha-256
作为方法。重新启动Postgres以使更改生效。这可以通过Windows
Services
应用程序或具有管理员权限的cmd
完成,例如Postgresql 12:WSL Shell Conveniences
在WSL中,将以下内容添加到
~/.bashrc
或类似文件中:然后重新加载您的
.bashrc
更改:source ~/.bashrc
用法
备注:
vEthernet
连接。Control Panel\Network and Internet\Network Connections
检查vEthernet
连接winhost
是否在防火墙规则的IP地址范围内。可能是WSL分配了一个我们没有预料到的IP地址!gcxthw6b2#
在WSL 2中,您需要使用主机IP连接
获取主机IP
grep nameserver /etc/resolv.conf | awk '{print $2}'
然后你需要允许TCP 5432入站规则在“Windows Defender防火墙与高级安全”
我做了我自己PS.you仍然需要允许TCP 5432在防火墙
把这个放进~/.bashrc
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
如果之前不存在主机IP,则将其附加到/etc/hosts(通常在重新启动wsl或计算机时发生)
然后
u91tlkcl3#
明确指定您的主机、端口和用户名例如:
mzmfm0qo4#
对我来说,有效的方法是遵循以下步骤:
host all all 0.0.0.0/0 trust
/etc/hosts
中指向我的主机的ip的主机名之一。这个主机名对我来说是:host.docker.internal
py49o6xq5#
这个问题可以通过两种可能的方式来解决
显式指定主机名和用户名
或
导航到runpsql.sh文件并运行查询
现在通过输入密码(如果需要)运行psql查询
xzv2uavs6#
我发现WSL 2确实给出了给予这个错误:
psql:错误:连接到服务器“localhost”(127.0.0.1),端口5432失败:服务器是否在该主机上运行并接受TCP/IP连接?
但WSL 1没有。
我有两个不同的WSL发行版运行Ubuntu,一个在WSL 1上,一个在WSL 2上,并在WSL 1上测试了连接,我的连接是成功的。
我把另一个降级,重新测试,它也工作。我重新升级,我得到了错误。
WSL 2是一个更完整的(见这里. https://learn.microsoft.com/en-us/windows/wsl/compare-versions),是一个完整的Linux内核和托管VM,而WSL 1不是。
如果你像我一样,你的测试要求不那么严格(切换到管理员用户来处理你工作笔记本电脑上的防火墙和postgres设置,对我来说是一个费力的过程),你只需要像我一样从Linux进行测试,你可以安装另一个WSL,让它保持在1甚至降级。值得注意的是,这将不支持牧场主桌面,因为它需要WSL 2。Docker Desktop安装了WSL 2,所以这不应该成为考虑因素。
更多信息在这里查看您的WSL版本等。
https://learn.microsoft.com/en-us/windows/wsl/compare-versions
HTH。