0

Paramiko を使用して、いくつかの画像を localhost にダウンロードし、SSH 経由でサーバーにアップロードしています。

ローカルにダウンロードせずにそれを達成する方法は? 大きなファイル (> 100 mb) のダウンロードおよびアップロード中にサーバーがタイムアウトするため。

これに似たもの: https://unix.stackexchange.com/questions/9029/how-to-wget-a-file-to-a-remote-machine-over-ssh

しかし、パイソンで。

4

1 に答える 1

1

次のようなネットワーク構造があると仮定します。

local machine ---X--- machine A
              |            |
              |            Z
              |            |
              ---Y---- machine B

次に、現在リンクを介してダウンロードしX、次にリンクを介してアップロードしていYます。machine Aと直接話すことができる場合はmachine B、リンクZも存在します。これは、との両方machine Amachine B公的にアクセス可能である場合です。

したがってmachine A、への画像の直接転送を開始する必要がありますmachine B。この時点でmachine A/B、転送を処理しているのは実行中のコードであるため、Pythonソリューションは転送を開始するのに役立つだけである可能性があります。

を使用してbashシェルからこれを実行している場合は、次のsshように入力します。

ssh user@machineA 'scp myfile user@machineB'

machine Aこれは、上のsshサーバーへのシェルアクセスがあり、scpプログラムがインストールされていることを前提としています。Paramikoはmachine A、転送自体を処理するためではなく、転送を開始するための接続を確立する場合にのみ役立ちます。

このようなものが機能する可能性があります:

ssh = paramiko.SSHClient()
ssh.connect('machineA', username='user', password='passwd')
stdin, stdout, stderr = ssh.exec_command("scp '{imgpath}' user@machineB".format(
    imgpath='path/to/file/on/machineA')

アップデート:

画像が提供されているが、sshログインアクセスがない場合は、ログインして画像をフェッチするコマンドを実行する machine Aことで、画像を直接プルできます。通常、これに使用できます。したがって、これを行うためのコードは次のようになります。machine Bmachine Bwgetlocalhost

ssh = paramiko.SSHClient()
ssh.connect('machineB', username='user', password='passwd')
stdin, stdout, stderr = ssh.exec_command("wget '{imgurl}'".format(
    imgurl='http://url.to.image/file')

テストでは、paramikoの使用をスキップし、ssh/wgetを直接使用します。

于 2013-03-22T04:35:36.027 に答える