在文件中生成阀杆列表Tor电路

时间:2018-07-03 20:51:09

标签: python tor

我试图使用Stem启动Tor连接,然后列出所选的节点。

使用其他问题和他们网站上的常见问题解答,我可以做一个或另一个,但不能两者都做。

例如,我可以用以下方式启动Tor电路

  tor_process = stem.process.launch_tor_with_config(
    config = {
      'ControlPort': '2778',
      'Log': [
        'NOTICE stdout',
        'ERR file /tmp/tor_error_log',
      ],
    "MaxCircuitDirtiness" : str(60*60*24*30),
    "NewCircuitPeriod" : str(60*60*24*30),
    },
  )

如果我使用here中的代码分别启动Tor,那么我可以分别查看电路节点。

但是,如果我尝试同时做这两者,例如:

from stem import CircStatus
from stem.control import Controller
import stem
import stem.connection
import stem.process

from stem.control import Controller

if __name__ == '__main__':
  tor_process = stem.process.launch_tor_with_config(
    config = {
      'ControlPort': '2778',
      'Log': [
        'NOTICE stdout',
        'ERR file /tmp/tor_error_log',
      ],
    "MaxCircuitDirtiness" : str(60*60*24*30),
    "NewCircuitPeriod" : str(60*60*24*30),
    },
  )

  with Controller.from_port() as controller:
    controller.authenticate()

    for circ in controller.get_circuits():
      if circ.status != CircStatus.BUILT:
        continue  # skip circuits that aren't yet usable

      entry_fingerprint = circ.path[0][0]
      entry_descriptor = controller.get_network_status(entry_fingerprint, None)

      if entry_descriptor:
        print "Circuit %s starts with %s" % (circ.id, entry_descriptor.address)
      else:
        print "Unable to determine the address belonging to circuit %s" % circ.id
  tor_process.kill()

我得到一个错误:

Traceback (most recent call last):
  File "circuit.py", line 22, in <module>
    with Controller.from_port() as controller:
  File "/usr/local/lib/python2.7/dist-packages/stem/control.py", line 1024, in from_port
    control_port = stem.connection._connection_for_default_port(address)
  File "/usr/local/lib/python2.7/dist-packages/stem/connection.py", line 1058, in _connection_for_default_port
    raise exc
stem.SocketError: [Errno 111] Connection refused

通常是我尝试做某事而没有单独启动tor时遇到的错误。

有没有办法将这两个操作结合起来?

编辑:有,我忘了在下面设置ControlPort回答了我的问题。

1 个答案:

答案 0 :(得分:1)

答案很简单,我忘记了在config中设置端口,我设置了ControlPort : 2778,但是打开了使用默认端口9051的Contoller.from_port()

使用Controller.from_port(port = 2778)解决了该问题。