Python - 用于多台计算机和多个文件的SCP与SSH

时间:2011-10-23 22:00:58

标签: python ssh scp

Python 2.4.x(无法安装任何非库存模块)。

大家都在问你。 (假设使用subprocess.popen)

假设您有20到30台机器 - 每台机器上有6-10个文件,您需要读取变量。

您是希望scp进入每台机器,每个文件一次(总共120 - 300个SCP命令),在将SCP下载到变量后读取每个文件 - 然后丢弃文件。

或者 - SSH到每台机器,每个文件一次 - 将文件读入内存。 (总共120 - 300个ssh命令)。

除非有其他方法可以在每台机器上一次性获取所有需要的文件(文件名为YYYYMMDD.HH.blah - 范围将给出20111023.00 - 20111023.23)。 - 将它们读入我无法想到的记忆中?

4 个答案:

答案 0 :(得分:2)

根据文件的大小,您可以执行以下操作:

...
files= "file1 file2 ..."
myvar = ""
for tm in machine_list
         myvar = myvar+ subprocess.check_output(["ssh", "user@" + tm, "/bin/cat " + files]);
...

file1 file2等是空格分隔的。假设所有都是unix盒子,你可以从每台机器上一次性/ bin / cat它们。 (这假设您只是在一个变量中加载整个内容)上面的变体.SSH将更容易诊断。

至少这是我的想法。

更新

使用类似

的内容
         myvar = myvar+Popen(["ssh", "user@" +tm ... ], stdout=PIPE).communicate()[0]

希望这有帮助。

答案 1 :(得分:0)

scp可以让您:

  1. 使用-r标记复制整个目录:scp -r g0:labgroup/ .
  2. 指定一个glob模式:scp 'g0:labgroup/assignment*.hs' .
  3. 指定多个源文件:scp 'g0:labgroup/assignment1*' 'g0:labgroup/assignment2*' .
  4. 不确定支持哪种globbing,可能只是使用shell来实现这一点。我也不确定它是否足够智能将来自同一服务器的副本合并到一个连接中。

答案 2 :(得分:0)

您可以通过ssh运行远程命令,该命令使用tar来一起tar所需的文件(允许结果转到标准输出),将输出捕获到Python变量中,然后使用Python的tarfile模块再次拆分文件。我真的不确定tarfile是如何工作的;在使用tarfile访问它之前,您可能必须将读取输出放入类似文件的StringIO对象中。

这将为您节省一些时间,因为您只需连接一台机器一次,从而减少在ssh协商中花费的时间。您还可以避免使用本地磁盘存储,这可以节省一些时间和/或能量 - 如果您在笔记本电脑模式下运行,或者在文件系统有限的设备上有用。

如果网络连接速度相对较慢,可以使用gzip或bzip压缩来进一步加快速度; tarfile支持解压缩。

答案 3 :(得分:0)

作为Inerdia答案的补充,是的,你可以通过使用大括号模式让scp在一个连接中传输多个文件:

scp "host:{path/to/file1,path/to/file2}" local_destination"

如果你的文件有共同的前缀或后缀,你可以使用大括号模式的正常好东西:

scp "host:path/to/{file1,file2}.thing" local_destination"

请注意,模式在引号内,因此在调用scp之前它们不会被shell扩展。我有一个明显连接延迟的主机,我在其上创建了两个空文件。然后执行类似上面的复制(引用括号模式)导致延迟,然后两个文件快速传输。当我省略引号时,本地shell将大括号扩展为scp的两个单独的host:file参数,然后在第一个文件之前和两个文件之间有明显的延迟。

这告诉我Inerdia建议指定多个host:file参数将重用连接来传输所有文件,但是使用带引号的大括号模式会。