SSHサーバー経由でファイルをダウンロードする方法


31

米国にサーバー(LinuxボックスB)があり、自宅のPC(LinuxボックスA)があり、WebサイトCからファイルをダウンロードする必要があります。

問題は、Aから直接ファイルをダウンロードするのが非常に遅いため、BにログインしsftpてAからファイルを取得するときにファイルをダウンロードする必要があることです。

ファイルをダウンロードし、1行のコマンドだけでBをプロキシとして直接使用する方法はありますか?

回答:


46

(奇妙な状況、三角形の不等式のようなものはインターネットルーティングに当てはまりませんか?)

とにかく、上で、次のことを試してくださいAsshB-D引き、

ssh -D 1080 address-of-B

これはでSOCKS5プロキシとして機能し、SOCKS5プロキシ127.0.0.1:1080接続をサポートするものなら何でも使用できます。 どうやら、wget環境変数を使用してこれを行うことができます

export SOCKS_SERVER=127.0.0.1:1080
wget http://server-C/whatever

時にはcurlもっと便利なこともあることに注意してください(つまりwget、SOCKS5を介してホスト名を検索できるかどうかはわかりませんが、これは私が思うにあなたの懸念の1つではありません)。また、FirefoxはこのようなSOCKS5プロキシを介して完全に機能します。

編集今、あなたが1行のソリューションを探していることに気づきました。さて、どうですか

ssh address-of-B 'wget -O - http://server-C/whatever' >> whatever

すなわち、wget-fetchedの出力をstdoutにリダイレクトし、ローカル出力を(リモートからのssh実行wgetから)ファイルにリダイレクトします。

これは機能しているように見えwgetますが、出力は少し混乱します( "に保存されます- ")。呼び出しに追加-qすることで削除できwgetます。


6
どうやらSOCKS_SERVER環境変数は、Ubuntuの14.04への影響はありません。
カスペルド

4
よると、この他の答えwgetのためのサポートがないSOCKS_SERVER変数を。その答えは、curl --socks5-hostnameまたはの使用を示唆していcurl --socks5ます。
デニルソンサマイア

@kasperd、それで、それが機能しないのはちょうどubuntuですか、それとも変数はwgetにまったく関連していませんか?socksify代わりに変数が使用されている可能性があります。
cnst

@cnst wgetのどのバージョンでも靴下をサポートしているという証拠は見ていません。socksify設定ではなく、別のプログラムです。
カスペルド

あなたが望むのであれば、基本的には、SOCKS_SERVER上の任意の効果を持っているwget、あなたはインストールする必要がありports.su/security/danteをした後、実行socksify wgetだけではなく、wget
CNST

3

別のアプローチとして、通常ログインしてセッションBを開始することもできますscreen。そこでwget、ファイルをすべて1つのディレクトリにまとめます。

そして、プログラムは喜んで実行できます。画面から切り離すだけで、バックグラウンドで実行できます。

ダウンロードが完了したら(多分それ以前)、あなたはからデータをfechできるBまでA使用してrsync(私の好みを)。


2

触発され、別の質問に別の答え、私が使用することをお勧めproxychains-ngのを(の新しいバージョンであるproxychains)。

  1. proxychains-ngをダウンロード、コンパイル、およびオプションでインストールします。
  2. proxychains.conf現在のディレクトリ、またはat ~/.proxychains/proxychains.conf、またはatにファイルを作成します/etc/proxychains.conf
    • または、別の場所に、または別の名前で1つのファイルを作成し、-fコマンドライン引数を使用するか、PROXYCHAINS_CONF_FILE環境変数を使用するかを指定します。
    • あるサンプル設定ファイルもご用意しています。最も関連するオプションは最後にあります。
  3. proxychains.confファイルに次を追加します。

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. を実行しますssh -D 1234 your_host_b。これにより、sshはlocalhostのポート1234でリッスンし、リモートホストをSOCKSプロキシとして使用します。

    • または、ssh -ND 1234 your_host_b代わりに実行します。-Nsshがリモートサーバー上でコマンドを実行できないようにします(つまり、シェルを開きません)。
  5. 実行:proxychains4 yourcommandhere yourparametershere。例を参照してください。
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/

2

オプション0:

使用するためにはwgetからSOCKS5プロキシでssh、あなたがインストールする必要がsecurity/dante使用するためにパッケージをSOCKS_SERVER持つオプションsocksifyのユーティリティを。

sudo pkg_add dante

その後、バックグラウンドでSSH接続を開きます。

ssh -N -C -D1080 user@hostB &

また、socksifyを介してSOCKS5プロキシを介してwgetを使用します。

env SOCKS_SERVER=127.0.0.1:1080 socksify wget http://website-C

オプション1:

ファイルをstdoutサーバーにパイプしstdinて、ワークステーションから読み取るだけです。

ssh -C user@hostB "wget -O- http://website-C" >> file-from-website-C

1

ボックスAからボックスBへのsshトンネルを行い、ボックスAのルーティングテーブルに追加できます。そのWebサイトCは、ボックスBへのトンネルを介して到達可能です。ボックスBでのパケット転送を許可する必要があります。

ここでは、非常に優れたステップバイステップのチュートリアルを見ることができます...


1

マシンBにトンネルを作成して、コールをWebサイトCにリダイレクトする必要があります。しかし、ISPが何らかの制限を設けていない限り、これがなぜ高速になるのか戸惑っています。

ワンライナーは知りませんが、これはそれほど複雑ではありません。

マシンAで、あなたはします(ランダムに11111を取得しました。1024を超えている限り、何でも好きなものを取得できます。または、rootになる必要があります)。

ssh -f -C -N -L 11111:C:80 username@B

Bのユーザー名は、Bに接続するために使用するものです。これにより、マシンBのポート11111にトンネルを作成し、マシンCのポート80(HTTPの443のWebサイトでHTTPSを使用)にリダイレクトする必要がありますオーダー ;) )

その後、マシンB経由でマシンAから直接ファイルをダウンロードできますhttp://C/path/to/file

wget http://B:11111/path/to/file

これは、HTTP 1.1の名前ベースの仮想ホスティングなしでファイルにアクセスできる場合にのみ機能しませんか?wgetによって発行されたGET要求では、ホスト名がCではなくBとして示されるため
CVn

@MichaelKjörling私はあなたに答えるのに十分な知識を持っていません。
ホイヘンス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.