0

Python の urllib2 内で SSH トンネルを使用しようとしています。


トンネルの作成:

ssh -N user@machine.place.edu -L 1337:localhost:80 
  • 上記の行はport 80、リモート マシンとport 1337ローカル マシンで使用する必要があります。
  • を使用-Nしたため、このトンネルが実行されている限り、bash プロンプトが (意図的に) ハングします。

でのトンネルの使用urllib2:

import urllib2
url = "http://ifconfig.me/ip"
headers={'User-agent' : 'Mozilla/5.0'}

proxy_support = urllib2.ProxyHandler({'http': 'http://127.0.0.1:1337'})
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))
urllib2.install_opener(opener)

req = urllib2.Request(url, None, headers)
html = urllib2.urlopen(req).read()
print html

上記のコードを実行するとhtml = urllib2.urlopen(req).read()、エラーがスローされますurllib2.HTTPError: HTTP Error 404: Not Found

何が問題になっている可能性がありますか?どうすれば修正できますか?


トラブルシューティング:

  • SSH トンネルをオフにすると、エラーが に変わりますurllib2.URLError: <urlopen error [Errno 61] Connection refused>。したがって、Python は明らかに SSH トンネルを「認識」しています。
  • に置き換えてプロキシをコメントアウトするopener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))opener = urllib2.build_opener()ifconfig.meページは適切にダウンロードされます。(もちろん、私が取り組んでいるプロジェクトでは、いくつかの異なるネットワークからドキュメントにアクセスする必要があるため、プロキシが必要です。)

一部の StackOverflow の投稿では、urllib2 の代わりにリクエストを使用することを提案しています。代わりに Requests を使用しても構いません。ここでは urllib2 を使用しました。なぜなら、Requestsでカスタム ヘッダー (たとえばuser-agentreferer

4

1 に答える 1

1

残念ながら、 にアクセスできるのはあなただけなので、machine.place.edu他の人が問題を再現することは不可能です。

まず、次のようなものを試してください...

$ telnet localhost 1337
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET http://ifconfig.me/ip HTTP/1.0

...「GET」行の後で Enter キーを数回押して、何が返されるかを確認します。

404 が表示される場合は、プロキシに問題がある可能性があります。

200 を取得した場合は、 でかなり簡単に再現できるはずですhttplib

于 2013-04-28T08:43:28.070 に答える