当前位置:  开发笔记 > 编程语言 > 正文

rsync over ssh - 使用Paramiko在Python中创建的通道

如何解决《rsyncoverssh-使用Paramiko在Python中创建的通道》经验,为你挑选了1个好方法。

我想使用rsync和SSH(来自Python程序)从远程计算机获取文件.

如何启动本地rsync实例并将其引入我用Paramiko打开的SSH通道?



1> haridsv..:

这是一个老问题,但仍然是谷歌在搜索"rsram over paramiko"时的第一次打击,这里唯一的投票项目是与OP的问题无关的评论(该评论中的链接指向使用ControlMaster Paramiko不支持.

还有就是怎样一个例子中的paramiko演示的一个设置本地端口转发在这里.在pull请求中还有一个更易于使用的版本.您可以通过两种方式使用本地端口转发:

    rsync使用ssh协议将ad-hoc本地端口转发到远程ssh服务器和本地端口.这相当于运行ssh -L12345:localhost:22 remote-host后跟rsync --rsh 'ssh -p 12345' sourcedir/file localhost:/destdir/file.

    rsync使用rsync协议将ad-hoc本地端口转发到ad-hoc远程rsync守护程序和本地端口.这类似于ssh -L12345:localhost:12345后续运行rsync sourcedir/file rsync://localhost:12345/module/destdir/file,除了您需要设置一个ad-hoc rsync守护程序,其上运行12345的模块名称指向destdir远程主机上的模块名称.

我个人更喜欢上面的第二种方法,虽然它稍微复杂一点,因为它会跳过本地ssh客户端并使用rsync协议,我认为它比使用更有效ssh.

使用ForwardServer上面的pull请求,代码看起来有点像这样(取决于Fabric):

RSYNC_SPEC = """
port=12345
use chroot=false

[homedir]
log file=/tmp/rsync-ad-hoc.log
max verbosity=4
path=/home/{user}/
read only=false
"""

@task
def rsync(local_path, remote_path):
    """
    local_path: Absolute path to a local source
    remote_path: Relative path (from home directory) to a remote destination
    """
    with ForwardServer(0, "localhost", rsync_port, connections[env.host_string].get_transport()) as serv:
        local_port = serv.socket.getsockname()[1]
        run("killall rsync; rm -f /tmp/rsync-ad-hoc.log /tmp/rsync-ad-hoc.conf; :")
        put(local_path=StringIO(RSYNC_SPEC.format(user=env.user)), remote_path="/tmp/rsync-ad-hoc.conf", )
        run("rsync --daemon --config /tmp/rsync-ad-hoc.conf")
        remote_rsync_path = os.path.join("rsync://localhost:%s/homedir" % local_port, remote_path)
        # Rsync expects the root of the destination to exist.
        run("mkdir -p /home/{user}/{path}".format(user=env.user, path=remote_path))
        logging.info("Attempting rsync from (localhost, %s, %s) to (%s, %s, %s)", local_port, local_path, env.host_string, rsync_port, remote_path)
        local("rsync -avzPh --delete %s/ %s/" % (local_path, remote_rsync_path))

您还可以使该函数采用远程绝对路径并生成模块的目录(而不是假设它相对于用户的主目录).

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有