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

gav*_*man 77 python fabric

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

mik*_*iku 112

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

local_path可以是相对或绝对本地文件或目录路径,并且可以包含shell样式通配符,如Python glob模块所理解的.还执行了Tilde扩展(由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
# ...
Run Code Online (Sandbox Code Playgroud)


小智 31

我还会看一下Project Tools模块:fabric.contrib.project 文档

它有一个upload_project带有源和目标目录的函数.更好的是,有一个rsync_project使用rsync 的功能.这很好,因为它只更新已更改的文件,并接受额外的args,如"exclude",这对于排除.git目录这样做很有帮助.

例如:

from fabric.contrib.project import rsync_project

def _deploy_ec2(loc):

    rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')
Run Code Online (Sandbox Code Playgroud)

  • 最新版本的`fabric.contrib.project` 文档:http://docs.fabfile.org/en/latest/api/contrib/project.html (2认同)

TGO*_*TGO 6

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

pip install patchwork

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

cxn = fabric.Connection('username@server:22')
Run Code Online (Sandbox Code Playgroud)

您可以rsync如下使用:

import patchwork.transfers
patchwork.transfers.rsync(cxn, '/my/local/dir', target, exclude='.git')
Run Code Online (Sandbox Code Playgroud)

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

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