在Machine1上,我有一个Python2.7脚本,该脚本在RAM中计算一个很大(最大10MB)的二进制字符串,我希望将该字符串写入到Machine2上的磁盘文件中,Machine2是一台远程计算机。执行此操作的最佳方式是什么?
约束:
这两台机器都是Ubuntu13.04。它们之间的连接速度很快--它们位于同一网络上。
目标目录可能在Machine2上尚不存在,因此可能需要创建它。
如果很容易,我希望避免将字符串从RAM写入Machine1上的临时磁盘文件。这是否消除了可能使用系统调用进行rsync的解决方案?
因为字符串是二进制的,所以它可能包含可以解释为换行符的字节。这似乎排除了可能对Machine2上的echo命令使用系统调用的解决方案。
我希望它在Machine2上尽可能轻量级。因此,我希望避免在Machine2上运行ftp之类的服务或在那里进行其他配置活动。另外,我不太了解安全,因此除非确实有必要,否则希望避免打开额外的端口。
我在Machine1和Machine2上设置了ssh密钥,并且要使用它们进行身份验证。
编辑:Machine1正在运行多个线程,因此可能会有多个线程尝试在重叠时间写入Machine2上的同一文件。我并不介意在这种情况下将文件写入两次(或更多次)会导致效率低下,但是在Machine2上产生的数据文件不应该因同时写入而损坏。是否需要计算机2上的操作系统锁?
我支持rsync解决方案,因为它是一个我非常了解的独立实体,不需要在Machine2上进行配置。
您使用subprocess.Popen
向Machine2打开一个新的推荐答案进程,然后将数据写入其STDIN。
import subprocess
cmd = ['ssh', 'user@machine2',
'mkdir -p output/dir; cat - > output/dir/file.dat']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
your_inmem_data = 'foobarbaz ' * 1024 * 1024
for chunk_ix in range(0, len(your_inmem_data), 1024):
chunk = your_inmem_data[chunk_ix:chunk_ix + 1024]
p.stdin.write(chunk)
我刚刚验证它是否如播发的那样工作,并复制所有的10485760个虚拟字节。
P.S.一个可能更干净/更优雅的解决方案是让Python程序将其输出写入sys.stdout
,然后将管道传输到ssh
外部:
$ python process.py | ssh <the same ssh command>
这篇关于如何将字符串写入远程计算机上的文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!