Ruby Tor 切换 Ip - "general SOCKS server failure" 除非我生成一个新进程来远程登录到 Tor 控制端口
Ruby Tor Switching Ip - "general SOCKS server failure" unless I spawn a new process to telnet into Tor control port
当尝试使用 telnet 切换 Tor IP 地址时,我在尝试通过 telnet 连接到 Tor 控制端口时 运行 进入 SOCKSError::ServerFailure: general SOCKS server failure
。但是,如果我生成一个新进程来进行远程登录,我没有问题。我不想产生一个新的过程,因为它很丑。我希望有人能帮助我找到为什么我有这个问题和更鲁棒的解决方案?
重现:
开始:
tor --SocksPort 9350 --ControlPort 53500 --CookieAuthentication 0 --HashedControlPassword <passwordhash> --DataDirectory /tmp/tor_data/9350
然后 运行 这个 ruby 代码使用 socksify
to setup a socks server, then uses the tor
gem Tor::Controller.connect
块通过 telnet 连接到 Tor 控制端口以切换 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
我意识到 socks 服务器正在通过 SOCKS 服务器路由所有 TCP 请求,包括我的 telnet 请求。如果我在 telnet 时禁用 socks 服务器,然后再次重新启用它,它会起作用:
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"
当尝试使用 telnet 切换 Tor IP 地址时,我在尝试通过 telnet 连接到 Tor 控制端口时 运行 进入 SOCKSError::ServerFailure: general SOCKS server failure
。但是,如果我生成一个新进程来进行远程登录,我没有问题。我不想产生一个新的过程,因为它很丑。我希望有人能帮助我找到为什么我有这个问题和更鲁棒的解决方案?
重现:
开始:
tor --SocksPort 9350 --ControlPort 53500 --CookieAuthentication 0 --HashedControlPassword <passwordhash> --DataDirectory /tmp/tor_data/9350
然后 运行 这个 ruby 代码使用 socksify
to setup a socks server, then uses the tor
gem Tor::Controller.connect
块通过 telnet 连接到 Tor 控制端口以切换 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
我意识到 socks 服务器正在通过 SOCKS 服务器路由所有 TCP 请求,包括我的 telnet 请求。如果我在 telnet 时禁用 socks 服务器,然后再次重新启用它,它会起作用:
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"