rsync es definitivamente la herramienta adecuada para este trabajo. Existe para mantener los directorios sincronizados y puede hacerlo con un poco de inteligencia. Por ejemplo: transferirá sólo deltas siempre que pueda y puede trabajar sobre túneles ssh.
Digamos que tienes una máquina fuente que aloja su versión en vivo del árbol de directorios /my/tree
y la máquina fregadero que quieres mantener en estrecha sincronización con él. Si tuvieras una cuenta ssh en fregadero podrías, desde fuente utilice rsync de la siguiente manera:
rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree
Esto supone que usted quiere /my/tree
en el mismo punto exacto de fregadero como lo tienes en fuente . Por supuesto, no es necesario que lo mantengas exactamente en el mismo lugar.
Desglosando la línea de comandos:
-avz
: modo de archivo, salida verbosa, uso de la compresión durante la transferencia
--delete
: borrar archivos en Sincronización que no están presentes en fuente
-e ssh
: Utilice ssh como método de conexión
Esta llamada, por supuesto, te pedirá tu contraseña cuando la hagas. Si quieres hacer esto de alguna manera automatizada vas a necesitar compartir algunas claves entre las cuentas de las máquinas y usar encriptación de clave pública-privada para hacer la conexión ssh.
Para configurar su par de claves para este rysnc, ejecute el siguiente comando en su fuente máquina:
> ssh-keygen -t rsa -b 2048 -f ~/.ssh/my-rsync-key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in ~/.ssh/my-rsync-key.
Your public key has been saved in ~/.ssh/my-rsync-key.pub.
The key fingerprint is:
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 root@source
> chmod 600 ~/.ssh/my-rsync-key
Para que este par de claves funcione tenemos que añadir el contenido de ~/.ssh/my-rsync-key.pub
a la ~<remoteuser>/.ssh/authorized_keys
archivo en el fregadero máquina.
En primer lugar, copie el archivo en el fregadero máquina:
scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~
A continuación, haga clic en el botón fregadero e importar la clave ejecutando lo siguiente como usuario remoto en la máquina:
> if [ ! -d ~/.ssh ]; then mkdir ~/.ssh ; chmod 700 ~/.ssh ; fi
cd ~/.ssh/
if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi
cat ~/my-rsync-key.pub >> authorized_keys
rm ~/my-rsync-key.pub
Para obtener consejos adicionales sobre el bloqueo de la conexión ssh entre su fuente y fregadero máquinas recomiendo echar un vistazo a esta página .
De su fuente puede probar que esta configuración funciona ejecutando:
rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree
Eso hará un simulacro de un rsync. Si ves que el comando rsync se conecta y compara los archivos, sabrás que las cosas están bien configuradas.
Ahora necesitamos una forma fácil de llamar a este comando rsync desde un archivo de configuración de LaunchD como se muestra en esta útil respuesta en este sitio . Como quieres que esta llamada se produzca en un bucle cerrado, tendrás que asegurarte de que no tienes varias copias del rsync ejecutándose al mismo tiempo. Puedes usar flock para crear un mutex que asegura que un script bash es singleton: sólo una instancia de él se ejecuta a la vez en una máquina. Así que vamos a crear el siguiente script en el disco:
#!/bin/sh
SINK_INSTANCE=remoteuser@sink
DIR=/my/tree
KEY=~/.ssh/my-rsync-key
LOG = ~/my_rsync.log
LOCK = ~/my_rsync.lock
SOURCE=/my/tree
exec 9>${LOCK}
if ! flock -n 9 ; then
echo "Another instance of your rsync is already running";
exit 1
fi
echo "----------" >> ${LOG}
echo `date` >> ${LOG}
rsync -avz --delete -e "ssh -i ${KEY}" \
${SOURCE}/ {SINK_INSTANCE}:${SOURCE} 2>&1 >> ${LOG}
Guárdalo como ~/my_rsync.sh
.
Ese script se encargará de hacer el rsync por ti. Todo lo que necesitas hacer ahora es configurarlo a través de LaunchD y hacer que se ejecute en un bucle cerrado. Siguiendo las instrucciones de aquí y modificándolo para que se ajuste a nuestras necesidades, vamos a crear ~/Library/LaunchAgents/my-rsync.plist
en un editor de texto y hacer el contenido:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>My Rsync</string>
<key>Program</key>
<string>/bin/sh</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>while sleep 5s; /Users/my/my_rsync.sh; done</string>
</array>
<key>ServiceDescription</key>
<string>Keep /my/tree synchronized with the machine sink</string>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
Eso debería solucionar las cosas.
Se aplican las advertencias habituales: He escrito esto de memoria y no lo he probado. Así que no lo sigas a ciegas. Pruebe cuidadosamente a lo largo del camino. Siempre que tengas dudas, utiliza la función --dry-run
en rsync. Imprimirá lo que sería sin hacer nada en realidad.