2017-08-03 76 views
0

当试图使用telnet切换Tor IP地址时,我试图连接到Tor控制端口时运行到SOCKSError::ServerFailure: general SOCKS server failure通过telnet。但是,如果我产生一个新的进程来进行telnetting,我没有问题。我不想因为丑陋而产生新的过程。我希望有人能帮我找到为什么我有这个问题和更多的解决方案?Ruby Tor切换IP - “一般SOCKS服务器故障”,除非我产生一个新的进程telnet到Tor控制端口

要重现:

开始TOR:

tor --SocksPort 9350 --ControlPort 53500 --CookieAuthentication 0 --HashedControlPassword <passwordhash> --DataDirectory /tmp/tor_data/9350

然后运行它使用socksify设置一个袜服务器这个红宝石代码,然后使用tor宝石Tor::Controller.connect块,其连接到Tor的控制端口通过telnet切换到Tor端点:

require 'socksify' 
require 'terminator' 
require 'tor' 

TCPSocket::socks_server = "127.0.0.1" 
TCPSocket::socks_port = "9350" 

Tor::Controller.connect(:port => 53500) do |tor| #<- error 
    tor.authenticate("") 
    tor.signal("newnym") 
end 

错误在Tor::Controller.connect电话:

SOCKSError::ServerFailure: general SOCKS server failure 

如果我更换Tor::Controller.connect块与此(产生一个新的进程做远程登录),我有成功:

telnet_pid = nil 
begin 
    Terminator.terminate :seconds => 20 do 
    cmd = "bundle exec ruby -e \"require 'tor'\" -e " + 
      "\"Tor::Controller.connect(:port => 53500)" + 
      "{|tor| tor.authenticate(''); tor.signal('newnym')}\"" 
    telnet_pid = Process.spawn(cmd) 
    Process.wait telnet_pid 
    end 
rescue Terminator.error 
    puts 'Telnet process to switch Tor endpoint timed out!' 
    Process.kill('TERM', telnet_pid) if telnet_pid 
end 

回答

0

我意识到,SOCKS服务器是通过SOCKS服务器路由所有的TCP请求,包括我的telnet请求。如果我在telnetting时禁用袜子服务器,然后重新启用它,它会工作:

TCPSocket::socks_server = nil 
TCPSocket::socks_port = nil 

Tor::Controller.connect(:port => 53500) do |tor| #<- error 
    tor.authenticate("") 
    tor.signal("newnym") 
end 

TCPSocket::socks_server = "127.0.0.1" 
TCPSocket::socks_port = "9350"