14

Machine1 には、リモート マシンである Machine2 のディスク ファイルに書き込みたい大きな (最大 10MB の) バイナリ文字列を RAM で計算する Python2.7 スクリプトがあります。これを行う最善の方法は何ですか?

制約:

  • どちらのマシンも Ubuntu 13.04 です。それらの間の接続は高速です。それらは同じネットワーク上にあります。

  • 宛先ディレクトリーは Machine2 にまだ存在しない可能性があるため、作成する必要がある場合があります。

  • 簡単であれば、文字列を RAM から Machine1 の一時ディスク ファイルに書き込むことは避けたいと思います。これにより、rsync へのシステム コールを使用する可能性のあるソリューションが排除されますか?

  • 文字列はバイナリであるため、改行として解釈される可能性のあるバイトが含まれている可能性があります。これは、Machine2 で echo コマンドへのシステム コールを使用する可能性のあるソリューションを除外するように思われます。

  • これを Machine2 で可能な限り軽量にしたいと考えています。したがって、Machine2 で ftp などのサービスを実行したり、そこで他の構成作業を行ったりすることは避けたいと考えています。さらに、私はセキュリティについてよく理解していないため、本当に必要でない限り、追加のポートを開くことは避けたいと考えています。

  • Machine1 と Machine2 に ssh キーを設定しており、それらを認証に使用したいと考えています。

  • 編集: Machine1 は複数のスレッドを実行しているため、複数のスレッドが重複して Machine2 の同じファイルに書き込もうとする可能性があります。この場合、ファイルが 2 回 (またはそれ以上) 書き込まれることによる非効率性は気にしませんが、Machine2 の結果のデータファイルが同時書き込みによって破損することはありません。もしかしたら、Machine2 の OS ロックが必要ですか?

rsync ソリューションは自己完結型のエンティティであり、十分に理解しており、Machine2 で構成する必要がないため、rsync ソリューションを応援しています。

4

6 に答える 6

20

Paramikoは、リモート マシンでファイルを開くことをサポートしています。

import paramiko

def put_file(machinename, username, dirname, filename, data):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(machinename, username=username)
    sftp = ssh.open_sftp()
    try:
        sftp.mkdir(dirname)
    except IOError:
        pass
    f = sftp.open(dirname + '/' + filename, 'w')
    f.write(data)
    f.close()
    ssh.close()


data = 'This is arbitrary data\n'.encode('ascii')
put_file('v13', 'rob', '/tmp/dir', 'file.bin', data)
于 2013-10-05T21:10:12.970 に答える
3

@Erik Kaplunの回答を少し変更すると、以下のコードが機能しました。(.stdin.write ではなく、communicate() を使用)

import subprocess
# convert data to compatible format
cmd = ['ssh', 'user@machine2', 'cat - > /path/filename']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
p.communicate(data)
于 2021-07-01T02:06:49.727 に答える
0

サブプロセスを呼び出すだけなら、sh.pyが適切かもしれません 。

from sh import ssh
remote_host = ssh.bake(<remote host>) 
remote_host.dd(_in = <your binary string>, of=<output filename on remote host>) 
于 2013-10-05T22:53:30.633 に答える