0
0

More than 1 year has passed since last update.

#Ruby の Faraday で ssh + SOCKS による https proxy 接続ができなかったので faraday_adapter_socks gem で Middleware 指定をした

Last updated at Posted at 2019-11-03

SOCKS を起動

ssh -vND 8888  user@host

gem install

gem install faraday
gem install faraday_adapter_socks

Ruby or pry

環境変数に socks のURLを指定する

https_proxy=socks://127.0.0.1:8888 ruby some.rb
https_proxy=socks://127.0.0.1:8888 pry

Ruby Code

adapter を指定して get リクエストしてみる

Faraday.new(url: 'https://httpbin.org/ip') { |conn| conn.adapter :net_http_socks }.get.body

e.g result

IPアドレスを返してくれるサービスにリクエストを投げてみる
sshサーバーのIPアドレスが返ってきたら成功

[8] pry(main)> Faraday.new(url: 'https://httpbin.org/ip') { |conn| conn.adapter :net_http_socks }.get.body
=> "{\n  \"origin\": \"YYY.YYY.YYY.YYY, YYY.YYY.YYY.YYY\"\n}\n"

アダプタを指定しなかった場合

こんなエラーが起こっていた

[10] pry(main)> Faraday.new(url: 'https://httpbin.org/ip').get.body
Faraday::ConnectionFailed: end of file reached
from /usr/local/lib/ruby/2.5.0/net/protocol.rb:189:in `rbuf_fill'
Caused by EOFError: end of file reached
from /usr/local/lib/ruby/2.5.0/net/protocol.rb:189:in `rbuf_fill'

Grete gem "faraday_adapter_socks" !

thank you

module Faraday
  class Adapter < Middleware

    register_middleware net_http_socks: :NetHttpSocks

    class NetHttpSocks < Faraday::Adapter::NetHttp

      SOCKS_SCHEMES = ['socks', 'socks4', 'socks5']

      def net_http_connection(env)
        proxy = env[:request][:proxy]

        net_http_class = if proxy
          if SOCKS_SCHEMES.include?(proxy[:uri].scheme)
            Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port)
          else
            Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:user], proxy[:password])
          end
        else
          Net::HTTP
        end

        net_http_class.new(env[:url].host, env[:url].port)
      end
    end
  end
end

MiddleWare Image

image

Original by Github issue

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

Twitter

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0