Ruby Tor Switching Ip - "общий сбой сервера SOCKS", если я не создаю новый процесс для подключения к telnet в порт управления Tor
При попытке переключения IP-адреса Tor с помощью telnet я сталкиваюсь с SOCKSError::ServerFailure: general SOCKS server failure
при попытке подключения к порту управления Tor через telnet. Однако, если я создаю новый процесс для телнеттинга, у меня нет проблем. Я не хочу порождать новый процесс, потому что он ужасен. Я надеялся, что кто-нибудь может помочь мне найти причину этой проблемы и более грубого решения?
Воспроизвести:
начать тор:
tor --SocksPort 9350 --ControlPort 53500 --CookieAuthentication 0 --HashedControlPassword <passwordhash> --DataDirectory /tmp/tor_data/9350
Затем запустите этот код ruby, который использует socksify
настроить сервер socks, затем использует 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
Блок с этим (порождая новый процесс, чтобы сделать telnetting), у меня есть успех:
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
1 ответ
Я понял, что сервер socks направляет все запросы TCP через сервер SOCKS, включая мои запросы telnet. Если я отключаю сервер socks во время 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"