我需要一种方法来识别给定地址的给定端口是否正在运行Microsoft SQL Server,IBM DB2 Server的实例,或者两者都没有。
我的第一个想法是我可以使用Python的telnet库telnetlib
,如下所示:
import telnetlib
import socket
def checkDBServerType(address, port):
try:
tn = telnetlib.Telnet(address, port)
except socket.error:
return None
tn.write(<something>)
if <something-else> in tn.read_eager():
return "MSSQL"
else:
return "IBMDB2"
问题是,我不知道要发送什么。用户还将为我的程序提供用户名,密码和数据库名称,如果有帮助,也可以使用这些名称。
此外,这是我在ServerFault上的第一篇文章,虽然我有时会经常使用StackOverflow和SuperUser。这是我的问题的正确场所,还是更适合StackOverflow? (我无法确定服务器管理员类型人员或程序员类型人员是否更有可能提供帮助。)
答案 0 :(得分:3)
您不能简单地与数据库服务器“交谈”并希望它告诉您它正在运行的软件类型;没有标准的通用协议连接到数据库服务器,虽然查询语言(SQL)非常标准化,但底层连接基于每个数据库系统特定的协议;这些协议通常也不是基于文本的,因此您不能简单地打开数据库服务器的套接字并在其上写入内容;此外,它们通常不会被客户端应用程序直接使用:每个DBMS都提供了一组连接库,这些连接库可以巧妙地封装它们,因此您无需了解如何与数据库服务器通信,也可以专注于实际查询其数据。
最好的办法是获取SQL Server和DB2的客户端连接库,并要求每个人连接到远程服务器;首先成功的人会告诉你远程端有什么样的服务器。
答案 1 :(得分:3)
由于您只是在寻找启发式方法,因此我只是说能够连接到默认端口将是一个很好的第一次切割。因此,例如,如果您可以连接到TCP 1433,则可以合理地说该计算机正在运行SQL Server的默认实例。它当然不完美(即你可能得到误报或漏报),但它非常好。只有你能回答它是否足够好。