为什么Ruby无法连接到我的Tor网络?

Dav*_*ave 9 ruby ruby-on-rails tor net-http torsocks

我在Mac El Capitan上使用Ruby on Rails 4.2.7并且刚刚安装了Tor浏览器(v 6.0.4).我启动了我的Tor浏览器,通过查看几个网页验证了它的运行,但使用这个gem - https://github.com/dryruby/tor.rb,当我运行我的脚本时,Ruby不相信Tor在跑

    require 'tor'
    ...
    puts "avaailble: #{Tor.available?}"
    puts "version: #{Tor.version}"
Run Code Online (Sandbox Code Playgroud)

返回

avaailble: false
version:
Run Code Online (Sandbox Code Playgroud)

实际上,当我尝试使用https://github.com/brunogh/tor_requests gem 进行Tor请求时,网页请求立即返回,这让我相信Tor网络没有被使用,因为在Tor浏览器中它花费更长的时间(这是我用来对网页请求的代码)...

    uri = URI.parse(url)
    Net::HTTP.SOCKSProxy('127.0.0.1', 9150).start(uri.host, uri.port) do |http|
      f = http.get(uri.path)
    end
Run Code Online (Sandbox Code Playgroud)

如何让我的Ruby/Rails代码连接到我本地运行的Tor网络?

编辑:在回答给出的答案时,这里是我将PATH和DYLD_LIBRARY_PATH变量设置为...

localhost:myproject davea$ echo $PATH
/usr/local/opt/coreutils/libexec/gnubin:/opt/local/bin:/opt/local/sbin:/Users/davea/.rvm/gems/ruby-2.3.0/bin:/Users/davea/.rvm/gems/ruby-2.3.0@global/bin:/Users/davea/.rvm/rubies/ruby-2.3.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/mysql/bin/:/opt/gradle-2.7/bin:/opt/apache-maven-3.3.3/bin:/Users/    davea/.rvm/bin:/usr/local/mysql/bin:/Applications/TorBrowser.app/Contents/MacOS/Tor:/Users/davea/.rvm/bin:/usr/local/mysql/bin:/Applications/TorBrowser.app/Contents/MacOS/Tor
localhost:myproject davea$ echo $DYLD_LIBRARY_PATH
/Applications/TorBrowser.app/Contents/MacOS/Tor:/usr/local/mysql/lib:/usr/local/mysql/lib:
Run Code Online (Sandbox Code Playgroud)

这里是我的Rails控制台中的ht输出,尝试列出的命令...

localhost:myproject davea$ rails console
Running via Spring preloader in process 49987
Loading development environment (Rails 4.2.7.1)
2.3.0 :001 > 
2.3.0 :002 >   Tor::Config::CONFDIR = '/Applications/TorBrowser.app//Contents/MacOS/Tor'
(irb):2: warning: already initialized constant Tor::Config::CONFDIR
/Users/davea/.rvm/gems/ruby-2.3.0/gems/tor-0.1.2/lib/tor/config.rb:21: warning: previous definition of CONFDIR was here
 => "/Applications/TorBrowser.app//Contents/MacOS/Tor" 
2.3.0 :003 > Tor.available?
Run Code Online (Sandbox Code Playgroud)

dre*_*010 2

以下是使用brunogh/tor_requestsTor 浏览器的方法(简单):

require 'tor_requests'

Tor.configure do |config|
    config.ip = "127.0.0.1"
    config.port = "9150"
    config.add_header('User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0')
end

res = Tor::HTTP.get(URI('https://drew-phillips.com/ip-info/'))
p res.code
p res.body
Run Code Online (Sandbox Code Playgroud)

要开始dryruby/tor工作,需要做更多的工作:

它取决于您的 ENVPATH变量来查找 Tor 二进制文件,并且 Tor 浏览器在其路径中有一些库(至少在 Linux 上),如果您尝试直接执行它,则找不到这些库。在我看来,这似乎应该支持允许您在代码中添加路径,而不是依赖 PATH 。

尝试tor从控制台运行 Tor 浏览器的二进制文件会产生以下结果(稍后会详细介绍,可能不适用于 Mac):

tor: symbol lookup error: tor-browser_en-US/Browser/TorBrowser/Tor/tor: undefined 
symbol: evutil_secure_rng_set_urandom_device_file
Run Code Online (Sandbox Code Playgroud)

此外,从源代码安装 Gem 并不会为我们提供 GitHub 上可用的最新版本,并且似乎有一个version针对 Gem 版本 0.1.2 中未包含的方法的修复。因此,我提取了源代码并告诉程序从自定义路径加载 Gem。

工作代码:

require 'rubygems'
$:.unshift "./tor/lib"
require 'tor'

Tor::Config::CONFDIR = '/home/me/tor-browser_en-US/Browser/TorBrowser/Data/Tor'

p Tor::Config::CONFDIR
p Tor.available?
p Tor.version
Run Code Online (Sandbox Code Playgroud)

现在,为了让它成功运行,你需要设置你的PATHLD_LIBRARY_PATH(我相信在 Mac 上是这样DYLD_LIBRARY_PATH)。

所以我像这样运行 Ruby 代码:

PATH=/home/me/tor-browser_en-US/Browser/TorBrowser/Tor:$PATH \
LD_LIBRARY_PATH=/home/me/tor-browser_en-US/Browser/TorBrowser/Tor:$LD_LIBRARY_PATH \
ruby tor.rb
Run Code Online (Sandbox Code Playgroud)

这使得 Tor 浏览器成为二进制文件和库的第一个搜索路径。

然后我能够得到以下输出:

true
"0.2.8.6"
Run Code Online (Sandbox Code Playgroud)

希望有帮助!