2009-11-01 13 views
17

Desidero scrivere uno script python che esegua diverse istanze di rsync in sequenza per il backup dei dati su un altro computer.Controllo di rsync con Python?

Al momento ho solo questo file di testo con i comandi che uso e li ho appena copiati incollandoli nel terminale, e sembra un po 'sciocco.

Voglio poter usare Python per fare questo per me. So molto vagamente come usare subprocess.popen, ma non ho idea di come ottenere Python per interagire direttamente con rsync, come per aver inserito la mia password per me. Python può farlo?

Qualcosa di simile:

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

O è il meglio che posso fare è solo averlo, o anche uno script bash, basta eseguire le rsyncs in sequenza e devono digitare la password in più e più volte ?

Grazie in anticipo.

risposta

6

Uso rsync per eseguire il backup di tutti i siti Web dei miei clienti. Uno script è attivato da cron e utilizza Makefile per ciascun client a causa delle diverse esigenze.

Invece di fare qualcosa che immette la password, utilizzare ssh-keygen per creare una coppia di chiavi pubblica/privata e inserire la chiave pubblica sul computer remoto. Questo ti dà connessioni sicure, senza password. Questo significa anche che non devi esporre la porta rsync al mondo. Dopo aver superato la curva di apprendimento su questo (e non è molto ripida) ssh è più sicuramente tuo amico.

+0

Ho sicuramente pensato di utilizzare una coppia di chiavi per fare ciò, ma volevo vedere se era possibile avere un controllo di un altro programma poiché sembra un'abilità che potrebbe rivelarsi utile per situazioni che richiedono interazione e don ' Ho una soluzione facile per ignorarlo. Ma potrei finire comunque a fare una coppia di chiavi ... – Cheesemold

1

Se è necessario controllare in modo programmatico un processo secondario, è necessario esaminare pexpect.

+0

Questo sarà rilevante per molte persone: 'Le caratteristiche principali di Pexpect richiedono il modulo pty nella libreria standard Python, che è disponibile solo su sistemi tipo Unix. – Mawg

21

Se si desidera interagire con un sottoprocesso in generale, è possibile utilizzare pexpect come indicato altrove. Ma per il tuo caso particolare, supponendo che il tuo rsync funzioni su ssh (il default), potresti prendere in considerazione la possibilità di impostare una connessione passwordless ssh tra i due host, eliminando la necessità di inserire la password. Questo è un key-based solution e sarà molto più sicuro rispetto all'archiviazione della password nel codice sorgente.

Here's a blogger chi discute il vostro problema esatto e decide di andare con ssh senza password.

1

Non credo che supporti rsync out of the box, ma paramiko potrebbe avere alcuni componenti che è possibile riciclare?

0

Se è sufficiente inserire la password, è possibile provare a inserire la variabile ambientale RSYNC_PASSWORD o utilizzare l'opzione --password-file.

7

C'è un grande modulo Python scritto da Colin Stewart chiamato RSyncBackup che è poco conosciuto e poco documentato, ma molto utile.

Per impostazione predefinita, non contiene alcun metodo per includere una password i comandi rsync, quindi ho modificato il modulo e parlato in questo post del blog: http://technofart.blogspot.com/2012/02/rsync-controlled-by-python.html

un link al mio modulo può essere modificato trovato nella sezione Download del mio post.

Una soluzione basata su chiavi è anche una grande idea. Inoltre, molte implementazioni rsync cercheranno la variabile di ambiente RSYNC_PASSWORD, che puoi impostare.Basta fare attenzione se le variabili di ambiente sono visibili agli altri utenti.

2

Mi sento male, per aver risposto a questo ritardo, ma sento che la risposta di tutti gli altri era sbagliata. Hanno fatto KINDA rispondere alla tua domanda, ma non direttamente come avrebbero potuto.

Più precisamente, hai chiesto come catturare la password in modo interattivo. Per fare ciò suggerirei il getpass integrato. In breve, non stai interagendo con rsync. Stai afferrando la password dell'utente RIGHT prima di eseguire rsync e passando a rsync. Un'altra opzione è quella di consentire all'utente di passare in come opzione, la maggior parte dei miei script riga di comando utilizzano 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 

Per continuare, mi sono imbattuto su sua domanda, perché ero alla ricerca di qualcosa di simile. Solo una cronaca a chiunque altro là fuori, ho finito per riferimento i due di questi collegamenti di overflow dello stack: calling rsync from python subprocess.call e Python Subprocess.Popen from a thread

0

ho fatto un pacchetto chiamato paralle_rsync che fa i comandi rsync in parallelo. È possibile utilizzarlo all'interno di fabric per eseguire l'operazione su più host contemporaneamente.

+0

Dove troviamo questo pacchetto? E come è concesso in licenza? – Mawg