2009-11-01 17 views
17

He estado queriendo escribir un script python que ejecutaría varias instancias de rsync en secuencia para hacer copias de seguridad de datos en una computadora diferente.Controlando rsync con Python?

Por el momento solo tengo este archivo de texto con los comandos que uso y que acabo de copiar y pegar en la terminal, y parece un poco tonto.

Quiero ser capaz de usar Python para hacer esto por mí. Sé muy vagamente cómo usar subprocess.popen, pero no tengo ni idea de cómo conseguir que python interactúe directamente con rsync, como para ingresar mi contraseña. ¿Pitón puede hacer eso?

Algo así como:

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

O es lo mejor que puedo hacer es simplemente tenerlo, o incluso una escritura del golpe, basta con ejecutar las rsyncs en secuencia y tiene que escribir la contraseña en una y otra vez ?

Gracias de antemano.

Respuesta

6

Uso rsync para hacer una copia de seguridad de todos los sitios web de mis clientes. Una secuencia de comandos es activada por cron y utiliza Makefiles para cada cliente debido a sus diferentes necesidades.

En lugar de hacer algo que ingrese la contraseña, use ssh-keygen para crear un par de claves pública/privada y coloque su clave pública en la máquina remota. Esto le brinda conexiones seguras sin contraseña. Esto también significa que no tiene que exponer el puerto rsync al mundo. Después de superar la curva de aprendizaje en este (y no es muy pronunciado) ssh es más definitivamente su amigo.

+0

definitivamente he considerado el uso de un par de claves para hacer esto, pero quería ver si era posible tener un control del programa otra ya que parece una habilidad que podría ser útil para situaciones que requieren la interacción y don' t tiene una solución fácil para ignorarlo. Pero puede terminar haciendo un par de claves de todos modos ... – Cheesemold

1

Si necesita controlar mediante programación un subproceso, debe considerar utilizar pexpect.

+0

Esto será relevante para muchas personas: 'Las principales características de Pexpect requieren el módulo Pty en la biblioteca estándar de Python, que sólo está disponible en Unix systems.' – Mawg

21

Si desea interactuar con un subproceso en general, puede usar pexpect como se menciona en otro lugar. Pero para su caso particular, suponiendo que rsync se ejecuta en ssh (valor predeterminado), entonces puede considerar configurar una conexión passwordless ssh entre los dos hosts, lo que eliminará la necesidad de ingresar la contraseña. Este es un key-based solution y será mucho más seguro que almacenar su contraseña en su código fuente.

Here's a blogger que analiza su problema exacto y decide ir con ssh sin contraseña.

1

No creo que sea compatible con rsync de fábrica, pero paramiko podría tener algunos componentes que podría reciclar?

0

Si solo necesita ingresar la contraseña, puede intentar rellenar la variable de entorno RSYNC_PASSWORD o usar la opción --password-file.

7

Hay un gran módulo de Python escrito por Colin Stewart llamado RSyncBackup que es poco conocido y poco documentado, pero muy útil.

Por defecto, no contiene ningún métodos para incluir una contraseña en sus comandos rsync, por lo que modificó el módulo y hablamos de ello en esta entrada del blog: http://technofart.blogspot.com/2012/02/rsync-controlled-by-python.html

un enlace a mi módulo puede ser modificado encontrado en la sección de descargas de mi publicación.

Una solución basada en la clave también es una gran idea. Además, muchas implementaciones de rsync buscarán la variable de entorno RSYNC_PASSWORD, que puede configurar.Solo tenga cuidado si las variables de su entorno son visibles para otros usuarios.

2

me siento mal, para responder a esta tarde, pero me siento como todos los demás respuesta fue incorrecta. Respondieron KINDA a su pregunta, pero no directamente como podrían haberlo hecho.

Más al punto, que habían pedido cómo agarrar la contraseña de forma interactiva. Para hacerlo, sugeriría el paso de entrada incorporado. En resumen, no estás interactuando con rsync. Usted está tomando la contraseña del usuario DERECHA antes de ejecutar rsync y pasarla a rsync. Otra opción es permitir al usuario pasar en forma opcional, la mayoría de mis scripts de línea de comandos Utilice 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 

Para continuar, me topé con su pregunta porque yo estaba buscando algo similar. Como digo a alguien más por ahí, terminé hace referencia a los dos de estos enlaces de desbordamiento de pila: calling rsync from python subprocess.call y Python Subprocess.Popen from a thread

0

He hecho una llamada paralle_rsync paquete que hace comandos rsync en paralelo. Se puede utilizar dentro del tejido para realizar la operación en varios hosts al mismo tiempo.

+0

Dónde ¿encontramos este paquete? ¿Y cómo está licenciado? – Mawg