sshpass не копирует полные данные между двумя linux машинами - PullRequest
0 голосов
/ 26 мая 2020

Я использую python и paramiko для копирования файла размером 5 ГБ между сервером A и сервером B, и сценарий будет выполняться с serverX, который откроется как сеанс sh на serverb с serverX и запустит команду для копирования файла из сервер B с помощью sshpass. Скрипт работает, но не копирует весь файл размером 5 ГБ. копируется только половина, а иногда и меньше половины.

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(serverb, username=user, password=password)

try:
    stdin, stdout, stderr = client.exec_command("sshpass -p password scp -v -r root@serverA:/tmp/file_to_copy_name /tmp/",timeout=None)
except Exception as err:
    print("copy between server error")
    raise

1 Ответ

0 голосов
/ 26 мая 2020

Вы можете использовать Rsyn c поверх S SH вместо scp ( безопасное удаленное копирование файла ) с sshpass ( неинтерактивный s sh поставщик паролей ). Он поддерживает быструю инкрементную передачу файлов (может возобновить незавершенную загрузку), а использование ключа S SH намного безопаснее, чем передача сырого пароля через sshpass .

Что-то вроде:

rsync -az /root/bigfile.txt 198.211.117.129:/root/

-a для режима архива -z для сжатия файловых данных во время передачи

Руководство: https://download.samba.org/pub/rsync/rsync.html
Кроме того, он может возобновить копирование началось с scp.

Вот инструкция о том, как использовать его поверх S SH: https://www.digitalocean.com/community/tutorials/how-to-copy-files-with-rsync-over-ssh

Также, как уже было указано @pynexj , client.exec_command() не будет ждать завершения выполнения команды. Таким образом, вы можете иметь альтернативный способ проверить, был ли файл успешно скопирован и имеет ли те же данные, что и источник. Одним из вариантов может быть проверка MD5 ha sh: { ссылка }

И вы можете проверить: Какой самый быстрый алгоритм ha sh для проверить, равны ли два файла?

...