我目前有一个 Python 脚本,需要从 PostgreSQL 数据库获取一些数据。它目前运行良好,但我必须将脚本移至另一台服务器B
。PostgreSQL 数据库将保留在服务器上A
。
B
因此我的 Python 脚本需要从连接到服务器的服务器访问 PostgreSQL 数据库A
。
我尝试添加host=servera.my.url.de
,但结果却
could not connect to server: Connection refused
Is the server running on host "servera.my.url.de" (141.X.YZ.AB) and
accepting TCP/IP connections on port 5432?
服务器在那儿吗?
ping servera.my.url.de
PING servera.my.url.de (141.X.YZ.AB) 56(84) bytes of data.
64 bytes from XXXXX (141.X.YZ.AB): icmp_req=1 ttl=58 time=3.76 ms
64 bytes from XXXXX (141.X.YZ.AB): icmp_req=2 ttl=58 time=4.07 ms
64 bytes from XXXXX (141.X.YZ.AB): icmp_req=3 ttl=58 time=5.01 ms
^C
--- servera.my.url.de ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 3.768/4.287/5.014/0.529 ms
因此服务器正在运行并且可以访问。
我的 Python 脚本有问题吗?
psql -h servera.my.url.de -p 5930 -c "select 1"
psql: could not connect to server: Connection refused
Is the server running on host "servera.my.url.de" (141.X.YZ.AB) and accepting
TCP/IP connections on port 5930?
和
psql -h servera.my.url.de -p 5932 -U myusername -W -c "select 1"
Password for user myusername:
psql: could not connect to server: Connection refused
Is the server running on host "servera.my.url.de" (141.X.YZ.AB) and accepting
TCP/IP connections on port 5932?
端口扫描
$ nmap -p 5000-6000 -sT servera.my.url.de
Starting Nmap 6.00 ( http://nmap.org ) at 2014-02-05 10:40 CET
Nmap scan report for servera.my.url.de (141.X.YZ.AB)
Host is up (0.054s latency).
rDNS record for 141.X.YZ.AB: XXXXXX
Not shown: 992 closed ports
PORT STATE SERVICE
5000/tcp filtered upnp
5025/tcp filtered unknown
5190/tcp filtered aol
5222/tcp filtered xmpp-client
5554/tcp filtered sgi-esphttp
5555/tcp filtered freeciv
5900/tcp filtered vnc
5901/tcp filtered vnc-1
6000/tcp filtered X11
有趣的是 freeciv 正在运行......
当我将端口范围调高时,我得到了不同的结果:
$ nmap -p 1000-6000 -sT servera.my.url.de
Starting Nmap 6.00 ( http://nmap.org ) at 2014-02-05 10:40 CET
Nmap scan report for servera.my.url.de (141.X.YZ.AB)
Host is up (0.054s latency).
rDNS record for 141.X.YZ.AB: XXXXXX
Not shown: 4868 closed ports, 130 filtered ports
PORT STATE SERVICE
3000/tcp open ppp
4443/tcp open pharos
4444/tcp open krb524
端口 5025 是 PostgreSQL 吗?
其他尝试
$ ps aux | grep postgres | grep -v 'postgres:'
postgres 28928 0.0 0.0 90124 820 ? s 2013 0:59 /usr/lib/postgresql91/bin/postgres -D /path/pgsql/data
[my command]
$ lsof -p 28928
[does not return anything, but does not quit]
在 PostgreSQL 中我输入了SHOW port
,但它没有返回任何内容。这是否意味着 PostgreSQL 没有监听任何端口?我该如何让它监听?
这是某些设置吗/path/pgsql/data
?(我现在无法访问,但我可以询问。)
我该怎么做才能确定 postgreSql 正在监听哪个端口(或者它是否正在监听)?我如何让它监听端口(或更改端口)?我在这台机器上没有 root 权限,但我可以在服务器上使用 SSH 登录A
。
我确实看到了确定 PostgreSQL 的端口并从那里尝试了一切:
netstat
需要root权限lsof
不工作(我不知道服务器上出了什么问题......在我的计算机上,它运行正常)pg_lsclusters
好像没有安装
答案1
如果您可以从原始机器连接到 PostgreSQL,您可以看到它正在监听的端口:
SHOW port;
以及地址:
SHOW listen_addresses;
我猜listen_addresses
会是的localhost
,所以它不接受来自外部网络接口的 TCP/IP 连接。
要确认 PostgreSQL 正在监听什么,请使用:
netstat -ltnp
另一种可能性是数据库主机上的网络防火墙不允许您连接。tcptraceroute
从远程主机连接到端口,看看结果是什么。
答案2
首先,完全不能确定监听 5555 的是不是 freeciv。Nmap 使用一个名为 的文件,nmap-services
其中列出了每个端口的常用应用程序(如果该端口已在 IANA 注册,则通常是为该端口注册的应用程序)。但正如您所注意到的,完全有可能为任何服务使用另一个端口...
如果您使用选项 运行 nmap -sV
,它实际上会与端口通信并尝试不同的协议以查看哪个协议匹配。这当然会比使用 运行花费更长的时间sT
,并且可能会触发入侵检测警报(如果有)。
在这种特殊情况下,我敢打赌正在使用端口 5555 - 因为数据库服务器不太可能运行 freeciv,而且人们通常使用 5555、3333、6666 等端口号。所以如果我是你,我会先这样做,pgsql -p 5555
如果那不起作用,再nmap -sV
找出它是其他哪个端口。
(当然,从根本上来说这不是一个技术问题,而是一个社会问题。您的数据库管理员应该告诉您使用哪个端口;如果他们不这样做,您的老板应该让他们这样做。但我也曾去过 nmap 更快更可靠的地方……)
答案3
lsof 仅适用于运行它的用户启动的进程(root 可以看到全部),这就是它不显示 postgresql 端口的原因。
postgresql 的默认端口是 5432,但由于在您的情况下 show port 没有显示任何内容,我猜测 listening_address 在 postgresql.conf 中是这样设置的:
监听地址 = ''
或者守护进程正在运行“-c''”
您需要更改配置,以便 listen_address 监听“*”或服务器上的特定接口。