Подтвердить что ты не робот

Управление rsync с помощью Python?

Я хотел написать python script, который будет запускать несколько экземпляров rsync в последовательности для резервного копирования данных на другой компьютер.

В данный момент у меня есть только этот текстовый файл с используемыми мной командами, и я только что скопировал их в терминал, и это кажется глупым.

Я хочу использовать python для этого. Я очень смутно знаю, как использовать subprocess.popen, но я не знаю, как заставить python напрямую взаимодействовать с rsync, например, для ввода моего пароля для меня. Может ли python сделать это?

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

if theProccess.proccessResponse == "Password:" :
    theProccess.respond(string)

Или лучшее, что я могу сделать, это просто его или даже bash script, просто запустить rsyncs в последовательности и ввести пароль снова и снова?

Спасибо заранее.

4b9b3361

Ответ 1

Если вы хотите взаимодействовать с подпроцессом в целом, вы можете использовать pexpect, как упоминалось в другом месте. Но для вашего конкретного случая, предполагая, что ваш rsync работает поверх ssh (по умолчанию), вы можете захотеть установить связь passwordless ssh между два хоста, что избавит вас от необходимости вводить пароль. Это ключевое решение и будет гораздо более безопасным, чем сохранение вашего пароля в исходном коде.

Здесь блоггер, который обсуждает вашу точную проблему и решает пойти с без пароля ssh.

Ответ 2

Там отличный модуль Python, написанный Колином Стюартом, называется RSyncBackup, который мало известен и мало документирован, но очень полезен.

По умолчанию он не содержит методов включения пароля в ваши команды rsync, поэтому я изменил модуль и рассказал об этом в этом сообщении в блоге: http://technofart.blogspot.com/2012/02/rsync-controlled-by-python.html

Ссылка на мой модифицированный модуль можно найти в разделе "Загрузка" моего сообщения.

Ключевое решение также является отличной идеей. Кроме того, многие реализации rsync будут искать переменную среды RSYNC_PASSWORD, которую вы можете установить. Просто будьте осторожны, если переменные среды видны другим пользователям.

Ответ 3

Я использую rsync для резервного копирования всех веб-сайтов моих клиентов. A script запускается cron, и он использует Makefiles для каждого клиента из-за их различных потребностей.

Вместо того, чтобы делать что-то, что вводит пароль, используйте ssh-keygen для создания пары открытого/закрытого ключа и поместите свой открытый ключ на удаленную машину. Это дает вам безопасные соединения без пароля. Это также означает, что вам не нужно открывать порт rsync для всего мира. После того, как вы пройдете кривую обучения на этом (и это не очень круто), ssh определенно ваш друг.

Ответ 4

Мне плохо, потому что я отвечаю на это поздно, но я чувствую, что все остальные ответили неправильно. Они ответили KINDA на ваш вопрос, но не так, как могли бы.

Более того, вы спросили, как взять пароль в интерактивном режиме. Для этого я бы предложил встроенный getpass. Короче говоря, вы не взаимодействуете с rsync. Вы берете пароль от пользователя RIGHT перед выполнением rsync и передаете его в rsync. Другой вариант - разрешить пользователю передавать его в качестве опции, большинство сценариев командной строки используют optparse

import getpass
password = getpass.getpass('Password for %s: ' % opts.user)
try:
    #code that uses password
except Exception, e:
    # test to see if str(e) is really an invalid password error, if so tell the user and return or loop, up to you
    # else 
    raise Exception(e) # the error that was raised in the first place

Чтобы продолжить, я наткнулся на ваш вопрос, потому что искал что-то подобное. Просто FYI для кого-то еще, я закончил ссылку на две из этих переполненных ссылок стека: вызов rsync из python subprocess.call а также Python Subprocess.Popen из потока

Ответ 5

Если вам нужно программно управлять подпроцессом, вы должны изучить pexpect.

Ответ 6

Я не думаю, что он поддерживает rsync из коробки, но paramiko может содержать некоторые компоненты, которые вы могли бы переработать?

Ответ 7

Если вам просто нужно ввести пароль, вы можете попробовать заполнить переменную окружения RSYNC_PASSWORD или использовать опцию --password-file.

Ответ 8

Я создал пакет paralle_rsync, который выполняет команды rsync параллельно. Вы можете использовать его внутри структуры для выполнения операции на нескольких хостах одновременно.