Управление rsync с помощью Python? - PullRequest
17 голосов
/ 01 ноября 2009

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

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

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

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

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

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

Заранее спасибо.

Ответы [ 8 ]

21 голосов
/ 01 ноября 2009

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

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

7 голосов
/ 23 декабря 2010

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

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

Ссылку на мой модифицированный модуль можно найти в разделе Скачать моего поста.

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

6 голосов
/ 01 ноября 2009

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

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

2 голосов
/ 20 сентября 2013

Мне плохо из-за того, что я отвечаю так поздно, но мне кажется, что все остальные ответили неправильно. 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

Продолжая, я наткнулся на ваш вопрос, потому что искал что-то подобное. Просто для справки кому-то еще, я закончил ссылками на две из этих ссылок переполнения стека: вызов rsync из подпроцесса python. а также Подпроцесс Python. Открыть из потока

1 голос
/ 02 ноября 2009

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

1 голос
/ 01 ноября 2009

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

0 голосов
/ 25 октября 2015

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

0 голосов
/ 09 июня 2010

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

...