如何使用Fabric将目录复制到远程计算机?


79

我在本地计算机上有一个目录,我想使用Fabric将其复制到远程计算机上(并重命名)。我知道我可以使用复制文件put(),但是目录呢。我知道使用scp很容易,但是fabfile.py如果可能的话,我宁愿在我内部进行。

Answers:


113

您也可以使用put它(至少在1.0.0中使用):

local_path可以是相对或绝对本地文件或目录路径,并且可以包含shell样式的通配符,如Python glob模块所理解。波形扩展(由os.path.expanduser实现)也将执行。

请参阅:http : //docs.fabfile.org/en/1.0.0/api/core/operations.html#fabric.operations.put


更新:此示例对1.0.0很好(对我而言):

from fabric.api import env
from fabric.operations import run, put

env.hosts = ['frodo@middleearth.com']

def copy():
    # make sure the directory is there!
    run('mkdir -p /home/frodo/tmp')

    # our local 'testdirectory' - it may contain files or subdirectories ...
    put('testdirectory', '/home/frodo/tmp')

# [frodo@middleearth.com] Executing task 'copy'
# [frodo@middleearth.com] run: mkdir -p /home/frodo/tmp
# [frodo@middleearth.com] put: testdirectory/HELLO -> \
#     /home/frodo/tmp/testdirectory/HELLO
# [frodo@middleearth.com] put: testdirectory/WORLD -> \
#     /home/frodo/tmp/testdirectory/WORLD
# ...

谢谢。我有例外(是目录)吗?
gaviscon_man 2011年

@gaviscon_man:添加了一个(经过测试的)示例,但实际上它只是香草fab,没有花招。如果目标目录尚未存在,则会出现错误-所以我mkdir -p在之前添加了一个简单的目录put。(但是其他子目录(testdirectory在远程计算机上将自动创建的子目录下)。
miku

谢谢,这非常有帮助。
gaviscon_man 2011年

put正在工作。它会支持在源计算机上使用compress进行文件夹复制,而在远程计算机上进行解压缩。
拉姆·伊达瓦拉帕蒂

32

我还将查看“项目工具”模块:fabric.contrib.project 文档

它具有upload_project接受源目录和目标目录的功能。更好的是,有一个rsync_project使用rsync的函数。这很不错,因为它仅更新已更改的文件,并且接受诸如“ exclude”之类的额外参数,这对于执行诸如排除.git目录之类的事情非常有用。

例如:

from fabric.contrib.project import rsync_project

def _deploy_ec2(loc):

    rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')

2
fabric.contrib.project最新版本的docs:docs.fabfile.org/en/latest/api/contrib/project.html
lsh

比...更好put/get。也可以完美地用于从实时网站中获取用户上传的内容(例如upload=False,尚不能同时以两种方式工作)。
benzkji

我必须将排除的目录包装在列表中才能正常工作:exclude=['.git']
ryantuck

17

对于使用Fabric 2的用户,put不能再上传目录,只能上传文件。而且, rsync_project它不再是主Fabric包的一部分。该contrib包已被删除,因为这里解释。现在,rsync_project已重命名为rsync,并且您需要安装另一个软件包才能使用它:

pip install patchwork

现在,假设您已经创建了到服务器的连接:

cxn = fabric.Connection('username@server:22')

您可以rsync如下使用:

import patchwork.transfers
patchwork.transfers.rsync(cxn, '/my/local/dir', target, exclude='.git')

请参阅Fabric-Patchwork文档以获取更多信息。


有没有办法为rsync提供自动密码?
pg2455 '19

2
@ pg2455是的,使用connect_kwargs。例如:cxn = fabric.Connection('username@server:22', connect_kwargs=dict(password='yourpass'))
TGO

@TGO您能分享使用put选项传输文件的任何示例吗?
阿尼什

@Anishput无法在Fabric 2中上载。如果您使用的是Fabric 1,请参阅已接受的答案。在Fabric 2中,我使用了答案中提供的示例rsync
TGO

0

扩展TGO的答案,如果您想在Windows系统上使用它,则需要rsync的源,例如cygwin。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.