web-dev-qa-db-ja.com

SSHサーバーを介してファイルをダウンロードする方法

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

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

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

31
linjunhalida

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

とにかく、次を試してください[〜#〜] a [〜#〜]ssh into __[〜#〜] b [〜#〜]-D引数を付けて、

ssh -D 1080 address-of-B

これは、127.0.0.1:1080でSOCKS5プロキシとして機能します。これは、SOCKS5プロキシ接続をサポートするあらゆるもので使用できます。 どうやら、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で取得した出力をstdoutにリダイレクトし、ローカル出力(sshからwgetをリ​​モートで実行)をファイルにリダイレクトします。

これは機能しているようです。wgetの出力は少しわかりにくい( "saved to-")ので、-qwgetの呼び出しに追加することで取り除くことができます。

47
sr_

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

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

ダウンロードが完了したら(多分もっと早く)、Bを使用してAからrsyncにデータを取得できます(私の好み)。

3
glglgl

オプション0:

wget のSOCKS5プロキシで ssh を使用するには、 security/danteをインストールする必要があります パッケージを使用して、socksifyユーティリティでSOCKS_SERVERオプションを使用します。

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
2
cnst

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

  1. proxychains-ng をダウンロードしてコンパイルし、オプションでインストールします。
  2. 現在のディレクトリ、またはproxychains.conf、または~/.proxychains/proxychains.conf。に/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を実行します。 -Nは、sshがリモートサーバー上でコマンドを実行するのを防ぎます(つまり、シェルを開きません)。
  5. 実行:proxychains4 yourcommandhere yourparametershere。いくつかの例をご覧ください:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
2

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

ここ 非常に優れた段階的なチュートリアルを見ることができます...

1
Jan Marek

マシンBにトンネルを作成する必要があります。この場合、呼び出しはWebサイトCにリダイレクトされます。ただし、ISPが制限を設けていない限り、これがより高速になる理由に戸惑います。

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

マシンAでは、あなたはそうします(私はランダムに11111を取った、それが1024以上である限りあなたは何でも取ることができます、そうでなければあなたはルートになる必要があります)

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

Bのユーザー名は、Bへの接続に使用するものです。これにより、マシンBのポート11111にトンネルが作成され、マシンCのポート80(HTTPのWebサイトはHTTPSの443を使用)にリダイレクトされます(ごちゃごちゃしていないと思います)オーダー ;) )

次に、マシンAからマシンB経由でファイルを直接ダウンロードできます。ファイルがhttp://C/path/to/fileにあると想定しているので、次のように使用します。

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

これは、ポート転送(sshトンネリング)を介して行うことができます。これがリソースです: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.en.html#ToC9

基本的に、Bでポート転送を設定する必要があります。AがBにwgetを発行すると、BはパケットをCに転送し、結果をAに送り返します。

1
RonE