🖥
#Ruby の Faraday で ssh + SOCKS による https proxy 接続ができなかったので faraday_ada
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
Original by Github issue
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2019-11-03
Discussion