【问题标题】:Why is Ruby failing to connect to my Tor network?为什么 Ruby 无法连接到我的 Tor 网络?
【发布时间】:2016-09-11 16:52:44
【问题描述】:

我在 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}"

返回

avaailble: false
version:

确实,当我尝试使用 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

如何让我的 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:

这是我的 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?

【问题讨论】:

  • 该模块可能无法使用 Tor 浏览器的 Tor 实例,因为它运行自己的守护进程,其设置与普通 Tor 实例使用的设置不同。如果你打电话给http.get 到像 ipchicken.com 这样的网站,它是打印你的实际 IP 还是 Tor 的?
  • 第一个 Tor 模块也无法检测它是否可用或版本,因为它不知道如何定位 Tor 浏览器的 Tor 二进制文件,因为它不在您的 path 中。跨度>
  • 我对在路径中放置什么感到困惑。 Tor 应用程序安装在我的 /Applications/TorBrowser.app/ 目录中。这就是我要添加到 PATH 中的内容吗?
  • 路径必须是 tor 二进制文件所在的路径,我认为 TorBrowser.app 比这更深(我只熟悉它所在的 Linux 和 Windows 上的结构) Browser/TorBrowser/Tor/'。您还需要(对于 tor_requests)覆盖它的默认配置,因为它设置为使用端口 9050,而不是 Tor 浏览器使用的 9150。

标签: ruby-on-rails ruby tor net-http torsocks


【解决方案1】:

以下是使brunogh/tor_requests 与 Tor 浏览器一起工作的方法(简单):

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

要让dryruby/tor 工作需要更多的工作:

这取决于您的 ENV PATH 变量来查找 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

此外,从源代码安装 Gem 并没有为我们提供 GitHub 上可用的最新版本,并且似乎修复了 Gem 版本 0.1.2 中未包含的 version 方法。因此,我提取了源代码并告诉程序从自定义路径加载 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

现在,为了让它成功运行,您需要设置 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

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

然后我可以得到以下输出:

true
"0.2.8.6"

希望有帮助!

【讨论】:

  • 我没有使用“dryruby/tor”,所以我认为我应该只听从“让dryruby/tor 工作”这一行上方的建议?
  • 也许,在您的 OP 中,您使用 dryruby/tor (gem tor) 发布了代码。如果您不需要致电available?version,那么大部分内容都是不必要的。我关于与控制器交谈的其他答案不需要任何路径内容。
  • 可能Mac没有使用cookie的方式,你总是可以通过运行telnet localhost 9151找到,然后连接后自行发送AUTHENTICATE。如果它允许您连接,则不需要密码或 cookie,如果它被拒绝,则很可能使用 cookie auth。
  • 哦,你说得对——我用的是drytor。我的错,让我试试你发布的内容。
  • 我用您在我的问题中建议的输出更新了我的问题。希望我正确设置了 PATH 和 DYLD_LIBRARY_PATH,但是当我查询可用时我仍然收到“错误”消息?
猜你喜欢
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多