Python中如何使用proxychains连接MongoDB?

如题,在 proxychains 下怎么连接本地的 mongodb ? 报错如下:

xiaokeke[@xiaokeke](/user/xiaokeke):~$ proxychains mongo
ProxyChains-3.1 ( http://proxychains.sf.net)
MongoDB shell version v4.0.2
connecting to: mongodb://127.0.0.1:27017
|S-chain|-<>-127.0.0.1:1080-<><>-127.0.0.1:27017-<><>-OK
2018-09-30T17:07:40.738+0800 E QUERY    [js] Error: network error while attempting to run command 'isMaster' on host '127.0.0.1:27017'  :
connect@src/mongo/shell/mongo.js:257:13
@(connect):1:6
exception: connect failed

同样其实 redis 也不可以... 为什么要这样呢?因为我要爬外国网站需要在 proxychains 下来跑。 求大神们解决!


Python中如何使用proxychains连接MongoDB?

3 回复

这个问题其实有点混淆。proxychains 是一个系统级的代理工具,它通过 LD_PRELOAD 劫持网络库调用来工作。它不是一个 Python 库,所以你无法在 Python 代码里直接“使用”它。

正确的做法是:让你的 Python 进程本身通过 proxychains 启动。这样,该进程内所有的网络连接(包括 pymongo 发起的)都会自动走代理。

假设你已经安装并配置好了 proxychains(通常在 /etc/proxychains.conf~/.proxychains/proxychains.conf 中配置了代理服务器)。

步骤很简单:

  1. 正常编写你的 Python 连接 MongoDB 的脚本。 这里用 pymongo 举例。
  2. 使用 proxychains 命令来运行这个脚本。

示例代码 (connect_mongo.py):

import sys
from pymongo import MongoClient

def main():
    # 你的 MongoDB 连接字符串。注意,这里的主机名/IP 会被 proxychains 代理出去。
    # 例如连接本地MongoDB: mongodb://localhost:27017
    # 连接远程MongoDB: mongodb://your-mongo-host:27017
    mongo_uri = "mongodb://your-mongo-host:27017"
    
    try:
        client = MongoClient(mongo_uri, serverSelectionTimeoutMS=5000)
        # 触发一个简单的命令来测试连接
        client.admin.command('ping')
        print("成功通过代理连接到 MongoDB!")
        
        # 接下来可以进行你的数据库操作,例如:
        # db = client['your_database']
        # collection = db['your_collection']
        # print(collection.find_one())
        
        client.close()
    except Exception as e:
        print(f"连接失败: {e}", file=sys.stderr)
        sys.exit(1)

if __name__ == "__main__":
    main()

如何运行:

在终端中,不要直接用 python 命令,而是用 proxychains 包装它:

proxychains python connect_mongo.py

或者,如果你的 proxychains 命令是 proxychains4

proxychains4 python connect_mongo.py

核心原理: proxychains 会劫持 python 进程的 connect 等套接字调用,将它们重定向到你配置的代理服务器。对于你的 Python 代码和 pymongo 库来说,这一切是透明的,它们感知不到代理的存在,就像直接连接目标 MongoDB 一样。

一句话总结:用 proxychains 命令来启动你的 Python 脚本,而不是在脚本里调用它。


言辞有些不对,应该是求大神们帮忙!

回到顶部