相关文章推荐
咆哮的冰棍  ·  sqlite3存取数据 - ...·  2 月前    · 
痴情的橙子  ·  javascript 取得按钮 ...·  2 月前    · 
睿智的羊肉串  ·  Mockito不能mock ...·  1 年前    · 

如何使用Fabric将一个目录复制到远程机器上?

80 人关注

我在本地机器上有一个目录,我想用Fabric复制到远程机器上(并重命名)。我知道我可以用 put() 来复制文件,但是目录呢。我知道使用 put() 很容易 scp , but I would prefer to do it from within my fabfile.py if possible.

python
fabric
gaviscon_man
gaviscon_man
发布于 2011-03-16
3 个回答
miku
miku
发布于 2019-02-13
已采纳
0 人赞同

你也可以使用 put 来实现(至少在1.0.0中)。

替换代码1】可以是一个相对或绝对的本地文件或 目录路径 ,并可能包含 外壳式通配符 如同Python所理解的那样 glob 模块。还会进行蒂尔德扩展(由os.path.expanduser实现)。

See: 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
# ...
    
谢谢。我得到了一个异常(是一个目录)任何机会的一个例子?
miku
@gaviscon_man:添加了一个(经过测试的)例子,但实际上它只是普通的 fab ,没有什么技巧。如果目标目录还没有到位,你会得到错误--所以我在 put 之前加入了一个简单的 mkdir -p 。 但是其他子目录,也就是 testdirectory 下面的目录会在远程机器上自动创建)。
谢谢你,这很有帮助。
put 正在工作。它是否支持在源机器上压缩并在远程机器上解压的文件夹的复制。
Seth Gottlieb
Seth Gottlieb
发布于 2019-02-13
0 人赞同

我也会看一下项目工具模块: fabric.contrib.project

这有一个 upload_project 函数,它接受一个源和目标目录。 更好的是,有一个 rsync_project 函数,使用rsync。 这很好,因为它只更新有变化的文件,而且它接受额外的参数,如 "排除",这对做排除你的 .git 目录这样的事情很好。

from fabric.contrib.project import rsync_project
def _deploy_ec2(loc):
    rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')
    
lsh
fabric.contrib.project docs的最新版本。 docs.fabfile.org/en/latest/api/contrib/project.html
put/get 好得多。例如,对于从实时网站获取用户上传的内容,也能完美工作( upload=False ,它在两种方式下都能工作,这一点并不明显)。
我不得不把排除的目录包起来,以使其发挥作用。替换代码0
BitParser
BitParser
发布于 2019-02-13
0 人赞同

对于那些使用Fabric 2的用户, put 不再能上传目录,只能上传文件。另外, rsync_project 也不再是Fabric主包的一部分。 contrib 包已被删除。 正如这里所解释的 .现在, rsync_project 已经被改名为 rsync ,你需要安装另一个包才能使用它。

pip install patchwork

现在,假设你已经建立了一个与你的服务器的连接。

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

你可以使用rsync,如下图。