在 Machine1 上,我有一个 Python2.7 脚本,它在 RAM 中计算一个大的(最多 10MB)二进制字符串,我想将它写入 Machine2 上的磁盘文件,这是一台远程机器。做这个的最好方式是什么?
约束:
两台机器都是 Ubuntu 13.04。它们之间的连接很快——它们在同一个网络上。
Machine2 上可能尚不存在目标目录,因此可能需要创建它。
如果容易的话,我想避免将字符串从 RAM 写入 Machine1 上的临时磁盘文件。这是否消除了可能使用 rsync 系统调用的解决方案?
因为字符串是二进制的,所以它可能包含可以解释为换行符的字节。这似乎排除了可能使用对 Machine2 上的 echo 命令的系统调用的解决方案。
我希望它在 Machine2 上尽可能轻量级。因此,我想避免在 Machine2 上运行 ftp 之类的服务或在那里进行其他配置活动。另外,我不太了解安全性,因此除非真正必要,否则我想避免打开额外的端口。
我在 Machine1 和 Machine2 上设置了 ssh 密钥,并想使用它们进行身份验证。
编辑:Machine1 正在运行多个线程,因此多个线程可能会在重叠时间尝试写入 Machine2 上的同一文件。在这种情况下,我不介意将文件写入两次(或更多次)导致效率低下,但 Machine2 上生成的数据文件不应因同时写入而损坏。也许需要在 Machine2 上锁定操作系统?
我支持 rsync 解决方案,因为它是一个我相当了解的独立实体,并且不需要在 Machine2 上进行配置。
原文由 Iron Pillow 发布,翻译遵循 CC BY-SA 4.0 许可协议
您使用
subprocess.Popen
打开到 Machine2 的新 SSH 进程,然后将数据写入其 STDIN。我刚刚验证它是否像宣传的那样工作并复制了所有 10485760 个虚拟字节。
PS 一个可能更清洁/更优雅的解决方案是让 Python 程序将其输出写入
sys.stdout
而不是在外部执行管道到ssh
: