【问题标题】:Python script to get files from one server into another and store them in separate directories?Python脚本将文件从一台服务器获取到另一台服务器并将它们存储在单独的目录中?
【发布时间】:2012-10-01 15:55:19
【问题描述】:

我正在处理server 1。我需要编写一个 Python 脚本,我需要在其中连接到 server 2 并从一个目录中获取某些文件(名称以字母 'HM' 开头的文件)并将它们放入另一个目录中,该目录需要在运行时(因为程序的每次运行,都必须创建一个新目录,并且必须将文件转储到其中),server 1

我需要在 Python 中执行此操作,而且我对这种语言还比较陌生。我不知道从哪里开始编写代码。是否有不涉及“压缩”文件的解决方案?我已经查看了 Paramiko,但据我所知,它一次只传输一个文件。我什至看过 glob,但我不知道如何使用它。

【问题讨论】:

  • 在移动文件之前对文件进行 tar 处理有什么问题吗..
  • 这不是直接的答案,但听起来像是 Fabric 的工作
  • @avasal 我只是不想 tar,因为我认为这需要很多时间。
  • @user1452759:不要过早优化;先测量。
  • 您用scp 标记了您的问题,那么为什么不改用它呢?

标签: python ssh scp


【解决方案1】:

传输您可能想要查看 paramiko 的文件

import os
import paramiko

localpath = '~/pathNameForToday/'
os.system('mkdir ' + localpath)
ssh = paramiko.SSHClient() 
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, password=password)
sftp = ssh.open_sftp()
sftp.get(remotepath, localpath)
sftp.close()
ssh.close() 

如果你想使用 glob,你可以这样做:

import os
import re
import glob

filesiwant = re.compile('^HM.+') #if your files follow a more specific pattern and you don't know regular expressions you can give me a sample name and i'll give you the regex4it
path = '/server2/filedir/'
for infile in glob.glob( os.path.join(path, '*') ):
    if filesiwant.match(infile):
         print "current file is: " + infile

另外一个更简单的选择是使用 os.listdir()

import os
for infile in os.listdir('/server2/filedir/'):
    ...`

这能回答你的问题吗?如果不离开cmets

【讨论】:

  • 我需要在运行时指定“服务器 2”上的目录(我将在每次执行程序时创建)。据我所知,paramiko 不允许基于目录的传输。必须有一个文件名。但我不知道所有以“HM”开头的文件的名称
  • 嘿,要获取远程目录中的文件列表,您可以在我的第一个代码块中使用名为“sftp”的变量,如下所示:listOfFiles = sftp.listdir(remotedirectory) 然后您将遍历这些文件并将名称与模式匹配,如我在第二个代码块中所示。这对你有用吗?
  • 我实际上使用了这段代码的变体并得到了我想要的。我没有使用 sftp.listdir(remotedirectory)。我使用 exec_command 获取文件列表,将它们存储在变量中,然后相应地从远程服务器获取它们,但我肯定会查看 sftp.listdir。谢谢你的帮助!非常感谢!
【解决方案2】:

Python 不会是我执行此任务的首选,但您可以使用对系统的调用并运行 mkdir 和 rsync。特别是你可以做

import os
os.system("mkdir DIRECTORY")
os.system("rsync -cav user@server2:/path/to/files/HM* DIRECTORY/")

【讨论】:

  • 不清楚为什么这个被否决了,和上面的fabric一样,只是我没有直接写Python代码。
  • 可能是因为 OP 专门要求提供 Python 解决方案。
【解决方案3】:

只需使用 ssh 和 tar。无需涉及 Python

$ ssh server2 tar cf - HM* | tar xf -

远程 tar 可以通过管道直接进入本地 tar

【讨论】:

  • 我需要编写一个脚本来执行此操作。我选择了 Python。
  • 如果我们将其作为 Python 脚本的一部分而在 Python 中执行其他操作,那么最好使用 Python 函数。
  • @EL_DON,对我来说,这取决于具体情况。有时最好对内置工具进行子处理,以便将更多依赖项添加到简单脚本中。
【解决方案4】:

您可以使用fabric。在 server1 上创建fabfile.py

import os
from fabric.api import get, hosts

@hosts('server2')
def download(localdir):
    os.makedirs(localdir)  # create dir or raise an error if it already exists 
    return get('/remote/dir/HM*', localdir)  # download HM files to localdir

然后在 shell 的同一目录中运行:fab download:/to/dirfabfile.pyfabMakefilemake)。

【讨论】:

  • 我收到以下错误:致命错误:找不到任何 fabfiles!
  • 我在执行 'fabfile.py' 时出错了吗?
  • @user1452759:从带有fabfile.py的目录运行fab
  • 好的,谢谢!我找到了一个替代方案,但我会看看这个选项。
猜你喜欢
  • 2016-10-18
  • 2020-08-31
  • 2019-01-24
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2020-04-24
  • 2021-06-22
  • 2013-05-02
相关资源
最近更新 更多