Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 通过使用Telnet确定服务器是否运行MSSQL、IBM DB2或两者都不运行_Sql Server_Python_Telnet_Db2 - Fatal编程技术网

Sql server 通过使用Telnet确定服务器是否运行MSSQL、IBM DB2或两者都不运行

Sql server 通过使用Telnet确定服务器是否运行MSSQL、IBM DB2或两者都不运行,sql-server,python,telnet,db2,Sql Server,Python,Telnet,Db2,我需要一种方法来识别给定地址上的给定端口是否正在运行来自Python的Microsoft SQL Server、IBM DB2 Server实例,或者两者都不运行 我的第一个想法是我可以使用Python的telnet库,telnetlib,如下所示: import telnetlib import socket def checkDBServerType(address, port): try: tn = telnetlib.Telnet(address, port)

我需要一种方法来识别给定地址上的给定端口是否正在运行来自Python的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"
导入telnetlib
导入套接字
def checkDBServerType(地址、端口):
尝试:
tn=telnetlib.Telnet(地址、端口)
除socket.error外:
一无所获
tn.write()
如果在tn.read_eager()中:
返回“MSSQL”
其他:
返回“IBMDB2”
问题是,我不知道该送什么。用户还将为我的程序提供用户名、密码和数据库名,因此如果有帮助的话,这些也可以使用

此外,这是我在ServerFault上的第一篇文章,尽管我经常使用StackOverflow,有时使用SuperUser。这是我提问的合适地点,还是在StackOverflow上更合适?(我无法决定是服务器管理员类型的人还是程序员类型的人更有可能提供帮助。)

你不能简单地与数据库服务器“交谈”,并期望它告诉你它运行的是哪种软件;没有标准的通用协议连接到数据库服务器,尽管查询语言(SQL)非常标准化,但底层连接基于特定于每个数据库系统的协议;这些协议通常也不是基于文本的,因此您不能简单地打开数据库服务器的套接字并在其上写入内容;此外,客户机应用程序通常从不直接使用它们:每个DBMS都提供了一组连接库,这些连接库将它们巧妙地封装起来,这样您就不必了解如何与数据库服务器通信,并且可以专注于实际查询其数据

最好的办法是获取SQL Server和DB2的客户机连接库,并让它们各自连接到远程服务器;无论谁先成功,都会告诉您远程端的服务器是什么类型。

您不能简单地与数据库服务器“交谈”,并期望它告诉您它正在运行什么类型的软件;没有标准的通用协议连接到数据库服务器,尽管查询语言(SQL)非常标准化,但底层连接基于特定于每个数据库系统的协议;这些协议通常也不是基于文本的,因此您不能简单地打开数据库服务器的套接字并在其上写入内容;此外,客户机应用程序通常从不直接使用它们:每个DBMS都提供了一组连接库,这些连接库将它们巧妙地封装起来,这样您就不必了解如何与数据库服务器通信,并且可以专注于实际查询其数据


最好的办法是获取SQL Server和DB2的客户机连接库,并让它们各自连接到远程服务器;无论谁先成功,都会告诉您远程端的服务器是什么类型的。

因为您只是在寻找一种启发式方法,我想说,仅仅能够连接到默认端口将是一个很好的第一步。因此,例如,如果您可以连接到TCP 1433,您可以合理地说该机器正在运行SQL Server的默认实例。当然,它不是完美的(也就是说,你可能会得到假阳性或假阴性),但它非常好。只有您才能回答它是否对您来说足够好。

因为您只是在寻找一种启发,所以我想说,仅仅能够连接到默认端口将是一个很好的第一步。因此,例如,如果您可以连接到TCP 1433,您可以合理地说该机器正在运行SQL Server的默认实例。当然,它不是完美的(也就是说,你可能会得到假阳性或假阴性),但它非常好。只有你才能回答这对你来说是否足够好。

我个人觉得,是的,这是一个比较简单的问题,但有一个灰色区域。我想没关系。我个人觉得,是的,这是一个更大的问题,但有一个灰色区域。我想这很好。谢谢你的回复-我会记住它,但我希望有一个更简单的解决方案,具有更少的依赖性。也就是说,也许我可以只发送几个字节,而不是一个字符串,其中一个将响应,另一个将保持沉默。这将需要您研究和理解两个DBs的连接协议。我真的看不出这比使用它们的客户端库“更简单”,它们都可用于Python。感谢您的回复-我会记住这一点,但我希望有一个更简单的解决方案,具有更少的依赖性。也就是说,也许我可以只发送几个字节,而不是一个字符串,其中一个将响应,另一个将保持沉默。这将需要您研究和理解两个DBs的连接协议。我真的看不出这比使用它们的客户机库“更简单”,它们都适用于Python.+1并且被接受:这是一个我没有考虑过的令人惊讶的优点。作为记录,MSSQL通常在端口1433上,而IBMDB2通常在端口50000上。@ArtOfWarfare DB2的默认端口是50000,但与MSSQL或Oracle不同,发现DB2在其他端口上侦听是非常常见的。@Ianbjorhode-现在,我只是设置它来检查用户是否说他们在使用DB2,但他们选择了端口1433,或者他们说他们正在使用MSSQL,但他们选择了端口50000,然后提示用户让他们知道他们可能选择了错误的选项。问题在于,这是一个使用配置文件安装环境的脚本,如果他们做出了错误的选择,就很难撤消这些错误的选择(大约一个小时后,直到脚本运行完毕,他们才会意识到他们做出了错误的选择)。它在开始时执行这个简单的检查,以避免常见的错误。+1并接受:这是一个我没有考虑过的惊人的好观点。记录在案,