Есть ответ Как использовать 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)