Передача файлов между двумя удаленными серверами (локальное инициирование соединения) - PullRequest
0 голосов
/ 13 февраля 2019

Есть ответ Как использовать paramiko для передачи файлов между двумя удаленными серверами?

, но на самом деле он не отвечает на этот вопрос.

Что яМысль о том, чтобы сделать это, состоит в том, чтобы инициировать два подключения из третьего местоположения (например, на моем ноутбуке) и переносить некоторые файлы из одного местоположения в другое без необходимости сначала загружать эти файлы локально.

Итак, во-первых, возможно ли это вообще??Если да, улучшается ли оно вообще по сравнению со временем, необходимым для его локальной загрузки и последующей загрузки на другой пульт?И я не хочу ставить сценарий на пульт.Я хочу управлять передачей с моего компьютера.

У меня уже есть реализация, позволяющая получать файлы с одного пульта, загружать их локально и затем загружать на удаленный компьютер.Но мне нужно переместить много файлов, что может занять некоторое время, поэтому я задаюсь вопросом, может быть, есть лучший подход к этому.

Итак, у меня есть эта реализация (которая не работает, потому что она ожидает локальный путь):

def rpath_exists(path, sftp):
    """Check if remote path exists.

    Checking is done using paramiko connection.
    """
    try:
        sftp.stat(path)
    except IOError as e:
        if e.errno == errno.ENOENT:
            return False
        raise
    else:
        return True

def _is_rfile(remote_file_obj):
    """Check if remote path is file."""
    if stat.S_ISDIR(remote_file_obj.st_mode):
        return False
    return True


def transfer_dir(source, target, sftp_from, sftp_to, create_dir=True):
    """Transfer directory between two remotes using sftps."""
    if create_dir:
        _create_rdir(target, sftp_to)
    for item in sftp_from.listdir_attr(source):
        filename = item.filename
        source_path = os.path.join(source, filename)
        target_path = os.path.join(target, filename)
        if _is_rfile(item):
            # obviously this won't work, because it expects local path,
            # but I'm specifying remote path from sftp_from.
            sftp_to.put(source_path, target_path)
        else:
            if not rpath_exists(target_path, sftp_to):
                sftp_to.mkdir(target_path)
            # We specify create_dir=False, because only root dir can
            # be created.
            transfer_dir(
                source_path, target_path, sftp_from, sftp_to, create_dir=False)
...