在Python中连接代理(SOCKS)数据库

9

我正在尝试连接到一个需要代理(socks)才能连接的数据库,如果我手动使用代理连接,我可以连接上,但我需要让脚本连接到机器的代理(socks)才能执行这个SELECT

脚本

import socket
import socks
import requests
import pymssql

socks.set_default_proxy(socks.SOCKS5, "138.34.133.155", 1080, True, 'user','password')
socket.socket = socks.socksocket

server = '172.43.56.89'
username = 'user'
password = 'password'
database = 'dbname'

conn = requests.get(pymssql.connect(host=server,user=username,password=password,database=database))

cursor = conn.cursor()

cursor.execute("SELECT column FROM table")

row = cursor.fetchall()

conn.close()

for i in row:
    print(i)

输出

Traceback (most recent call last): File "connection.py", line 15, in conn = requests.get(pymssql.connect(host=server,user=username,password=password,database=database)) File "src\pymssql.pyx", line 642, in pymssql.connect pymssql.OperationalError: (20009, 'DB-Lib错误消息 20009,严重性 9:\n无法连接:自适应服务器不可用或不存在(172.43.56.89:1433)\nUnknown error中的Net-Lib错误(10060)\n')

此错误显示了在尝试连接数据库时发生的问题。可能是因为服务器不可用或不存在,或者由于网络库错误而导致连接失败。请检查输入参数是否正确,并确保数据库服务器可用。

1
pymssql 是使用 Cython 实现的。它不使用 socket 模块。因此,socks 模块无法为 pymssql 工作。 - blhsing
1
有解决办法吗? - Luis Henrique
2个回答

2

我认为一种选择是使用端口转发挂载本地隧道套接字,将您的数据库端口映射并表现得像您的服务器是本地主机。

如果您在Unix计算机上运行Python脚本,则非常有效。

类似于以下系统调用(对于3306 mariaDB):

ssh -L 3306:localhost:3306 user@x.x.x.x

首先,您运行SSH,然后告诉它启用端口转发,将3306端口转发到通过user@IP连接的服务器的localhost:3306端口。
有了这个,您的本地机器:3306的每个查询都将发送到您的MariaDB:3306服务器,使您可以像在服务器上一样使用它。

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "ip", 1080, True, 'user','password') socket.socket = socks.socksocketsocket.socket(os.system('ssh ip')) - Luis Henrique
好的,我明白你的想法,但我写不出来 :/ - Luis Henrique
我正在使用 Red Hat Linux 系统。 - Luis Henrique
1
@LuisHenrique 好的,很好~;所以,只需在控制台中手动运行 ssh -L 3306:localhost:3306 user@x.x.x.x 并将端口更改为数据库端口,然后尝试运行您的 .py,就好像您的数据库在本地主机上一样,无需代理。 - Blag
好的,我会进行测试并在这里添加,非常感谢! - Luis Henrique
显示剩余4条评论

1
如果您不想对pymssql源代码进行黑客攻击,可以使用外部工具将所有TCP流量重定向到socks代理,例如Windows的FreeCap,Linux的RedSocks和macOS的Proximac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接