Python - 对于多个计算机和多个文件,SCP与SSH的比较

0 投票
4 回答
2138 浏览
提问于 2025-04-17 04:51

这是关于Python 2.4.x的讨论(不能安装任何非官方模块)。

我想问大家一个问题。(假设使用subprocess.popen)

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

你会选择先用scp命令登录到每台机器,每个文件都执行一次(总共要执行120到300个scp命令),在每次下载文件后再读取到变量里,然后把文件丢掉吗?

还是说你会选择用SSH登录到每台机器,每个文件也执行一次(总共要执行120到300个ssh命令),直接把文件读到内存里?

你觉得哪种方式更好?

除非还有其他方法可以一次性把每台机器上所有需要的文件都抓取下来(这些文件的命名格式是YYYYMMDD.HH.blah,范围是20111023.00到20111023.23),不然我想不到有什么更好的办法来读取它们到内存里。

4 个回答

0

你可以通过 ssh 远程执行一个命令,这个命令会使用 tar 把你想要的文件打包在一起(结果会输出到标准输出),然后把这个输出保存到一个 Python 变量里。接着,你可以使用 Python 的 tarfile 模块把这些文件再拆分开来。我其实不太确定 tarfile 是怎么工作的;你可能需要把读取的输出放到一个像 StringIO 的文件对象里,然后才能用 tarfile 访问它。

这样做可以节省一些时间,因为你只需要连接每台机器一次,这样可以减少在 ssh 连接上的时间。你还可以避免使用本地磁盘存储,这样也能节省一些时间和能量——如果你是在笔记本模式下运行,或者在一个文件系统有限的设备上,这点特别有用。

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

0

scp 让你可以:

  1. 使用 -r 选项来复制整个文件夹:比如你可以输入 scp -r g0:labgroup/ . 来把远程的 labgroup 文件夹复制到当前目录。
  2. 指定一个通配符模式:例如 scp 'g0:labgroup/assignment*.hs' . 这样可以复制所有以 assignment 开头并且以 .hs 结尾的文件。
  3. 指定多个源文件:你可以这样写 scp 'g0:labgroup/assignment1*' 'g0:labgroup/assignment2*' . 来同时复制 assignment1 和 assignment2 开头的文件。

我不太确定支持什么样的通配符,可能是直接用的命令行的功能。另外,我也不确定它是否能聪明地把来自同一个服务器的复制任务合并成一个连接。

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]

希望这对你有帮助。

撰写回答