如何将字符串写入远程计算机上的文件?

2022-02-21 00:00:00 python rsync file ssh network-programming

问题描述

在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上进行配置。

SSH

您使用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>

相关文章