A menudo nos queremos conectar a una máquina remota para labores de gestión o de copias de seguridad, e instalar programas en ellas es difícil por no decir imposible ya que cabe la posibilidad de que en esas máquinas no tengamos permisos de súper usuario.

Pero si esa máquina tiene un sistema Linux, con los comandos ssh y rsync tendremos la vida solucionada. Veamos cómo.

ssh 

Directamente de wikipedia, podemos leer:

SSH (Secure SHell, en español: intérprete de órdenes segura) es el nombre de un protocolo y del programa que lo implementa, y sirve para acceder a máquinas remotas a través de una red. Permite manejar por completo la computadora mediante un intérprete de comandos, y también puede redirigir el tráfico de X para poder ejecutar programas gráficos si tenemos un Servidor X (en sistemas Unix y Windows) corriendo.

Además de la conexión a otros dispositivos, SSH nos permite copiar datos de forma segura (tanto ficheros sueltos como simular sesiones FTP cifradas), gestionar claves RSA para no escribir claves al conectar a los dispositivos y pasar los datos de cualquier otra aplicación por un canal seguro tunelizado mediante SSH.

Así que, como podemos comprobar, es una manera segura y cómoda de conectar con máquinas remotas, como una raspberry pi, por ejemplo. Pero pasemos a los ejemplos.

Si nuestra máquina (raspberry pi, servidor web, etc) está en una dirección IP que conocemos, basta con hacer:

ssh <nombre-de-usuario>@<dirección-IP>

En nuestro caso, si queremos conectar a la Raspberry Pi que tenemos en el router, basta con hacer:

ssh Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

E inmediatamente nos pedirá el password y, si es la primera vez que conectamos, nos preguntará "si nos fiamos" de las credenciales RSA para almacenarlas (le decimos que sí e inmediatamente estaremos en la máquina remota).

Tras esto, podéis comprobar que tenéis un terminal totalmente funcional sin estar sentados físicamente delante de la máquina, con todo lo que esto supone (se me ocurre por ejemplo que podéis gestionar la domótica de vuestra vivienda mientras estáis de viaje si ésta permite el acceso por ssh, por ejemplo; o decirle a la raspberry pi que encienda la tele y se ponga a grabar el programa que queréis...). Las posibilidades tras una conexión ssh son muchas y el límite lo pone la imaginación. Sin ir más lejos, nosotros controlamos las copias de seguridad de este espacio web vía ssh y rsync haciendo desde nuestro PC:

ssh <nombre-del-cliente>@prototipando.es

Y eso que nuestros servidores se encuentran en Madrid y nosotros en Sevilla. Todo un lujo y ahorro en gestión de la movilidad.

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

rsync

Pero dejemos de vanagloriar a ssh y pasemos a rsync, que es el que realmente se va a encargar no sólo de clonar dos directorios, sino de observar las diferencias que existan entre ellos para mantenerlos clonados a posteriori. Y es que wikipedia nuevamente nos lo explica muy bien:

rsync es una aplicación libre para sistemas de tipo Unix y Microsoft Windows que ofrece transmisión eficiente de datos incrementales, que opera también con datos comprimidos y cifrados. Mediante una técnica de delta encoding, permite sincronizar archivos y directorios entre dos máquinas de una red o entre dos ubicaciones en una misma máquina, minimizando el volumen de datos transferidos. Una característica importante de rsync no encontrada en la mayoría de programas o protocolos es que la copia toma lugar con sólo una transmisión en cada dirección. rsync puede copiar o mostrar directorios contenidos y copia de archivos, opcionalmente usando compresión y recursión.

Actuando como un daemon de servidor, rsync escucha por defecto el puerto TCP 873, sirviendo archivos en el protocolo nativo rsync o via un terminal remoto como RSH o SSH. En el último caso, el ejecutable del cliente rsync debe ser instalado en el host local y remoto. 

Hablando en plata, rsync no es más que un "gestionador" de espejos (mirrors), ya que nos permite tener dos réplicas idénticas en dos sitios distintos. Por ejemplo, cuando nuestro sitio empezó a crecer, tuvimos que mover todos los ficheros de nuestra instalación, por lo que nos conectamos por ssh y ejecutamos:

rsync -azv ./html_public/prototipando ./html_public/prototipando2

 Donde las opciones utilizados significan:

-a: Combina bastantes opciones de rsync. Combina la copia recursiva con opciones para el manejo de enlaces simbólicos (symlinks), preserva el grupo y propietario, y en general, hace de rsync una herramienta muy apropiada para la copia de archivos. Ten en cuenta que no conserva enlaces duros (hardlinks); si quieres que haga eso, necesitarás agregar la opción hardlinks (-H).

-z: La opción z es para comprimir los datos durante su transferencia. Si el fichero que estás copiando existe en el equipo local, rsync lo dejará sin tocar, y lo mismo pasaría si estuvieras moviendo ficheros a una máquina remota.

-v: Indica a rsync que muestre información hacerca de lo que esté haciendo. Puedes variar la cantidad de información doblando o triplicando la v, de modo que al usar -v obtienes algouna, usando -vv tienes más. y con -vvv rsync te dirá todo lo que pueda.

rsync mueve archivos ocultos (los que comienzan por “.”) sin tener que usar ninguna opción especial. Si quieres excluir dichos archivos, puedes usar --exclude=".*/". Esta opción también te puede ser útil para evitar copiar cosas como los archivos swap de Vim (.swp) y copias de seguridad automáticas (como los archivos .bak) creados por algunos programas.

Ahora supongamos que tienes un disco externo USB o FireWire, y quieres copiar datos de tu directorio home al disco externo. Una buena forma de hacer esto sería guardar todos los datos importantes en un solo directorio y luego copiarlo a un directorio de copias de seguridad en la unidad externa usando una orden como:

rsync -avh /home/usr/dir/ /media/disk/backup/

Si quieres asegurarte de que los archivos que hayas borrado desde la última vez que hiciste esta copia de archivos, también se borren del disco externo, puedes añadir la opción --delete, como en este ejemplo:

rsync -avh --delete /home/usuario/dir/ /media/disk/backup

Ten mucho cuidado con la opción delete; con ella, puedes eliminar un montón de ficheros sin querer. De hecho, mientras te acostumbras a usar rsync, probablemente sea una buena idea usar la opción --dry-run con las órdenes que vayas a ejecutar, lo que permite hacer un simulacro sin que realmente se copien o sincronicen los ficheros. Si ejecutas una orden y te das cuenta de que esto va a causar alguna foma de daño a los datos, pulsa Ctrl-c immediatamente para cancelar la transferencia. Puede que hayas perdido algunos ficheros, pero salvarás el resto.

¿Y qué pasa si quieres copiar los ficheros a otra máquina de la red? No hay problema — todo lo que necesitas hacer es añadir la información de usuario y host (la máquina remota). Por ejemplo, si quieres copiar el mismo directorio de antes a un equipo remoto, has de hacer esto:

rsync -avhe ssh --delete /home/usuario/dir/ Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.:dir/

Si quieres saber lo rápido que va la transferencia, y cuánto queda por copiar, añade la opción --progress:

rsync --progress -avhe ssh --delete /home/usuario/dir/ usuario@remote.host.com:dir/

Si no quieres que te pregunte una contraseña cada vez que rsync haga una conexión — y no lo querrás — asegúrate de configurar rsync para acceder mediante una clave SSH en lugar de una contraseña. Para ello, se crea una clave SSH en la máquina local usando ssh-keygen -t dsa, y pulsa Intro cuando te pregunte por una passphrase. Tras crear la clave, usa ssh-copy-id -i .ssh/id_dsa.pub Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. para copiar la clave pública al equipo remoto.

¿Y qué sucede si necesitas traer de vuelta a algunos de los archivos copiados usando rsync? Usa la siguiente sintaxis:

rsync -avze ssh remote.host.com:/home/usuario/dir/ /local/path/

La opción z es para comprimir los datos durante su transferencia. Si el fichero que estás copiando existe en el equipo local, rsync lo dejará sin tocar, y lo mismo pasaría si estuvieras moviendo ficheros a una máquina remota. A continuación, se adjunta la info que arroja rsync --help para tu comodidad:

rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.

Usage: rsync [OPTION]... SRC [SRC]... DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
  or   rsync [OPTION]... [USER@]HOST:SRC [DEST]
  or   rsync [OPTION]... [USER@]HOST::SRC [DEST]
  or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect
to an rsync daemon, and require SRC or DEST to start with a module name.

Options
 -v, --verbose               increase verbosity
 -q, --quiet                 suppress non-error messages
     --no-motd               suppress daemon-mode MOTD (see manpage caveat)
 -c, --checksum              skip based on checksum, not mod-time & size
 -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
     --no-OPTION             turn off an implied OPTION (e.g. --no-D)
 -r, --recursive             recurse into directories
 -R, --relative              use relative path names
     --no-implied-dirs       don't send implied dirs with --relative
 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         set backup suffix (default ~ w/o --backup-dir)
 -u, --update                skip files that are newer on the receiver
     --inplace               update destination files in-place (SEE MAN PAGE)
     --append                append data onto shorter files
     --append-verify         like --append, but with old data in file checksum
 -d, --dirs                  transfer directories without recursing
 -l, --links                 copy symlinks as symlinks
 -L, --copy-links            transform symlink into referent file/dir
     --copy-unsafe-links     only "unsafe" symlinks are transformed
     --safe-links            ignore symlinks that point outside the source tree
 -k, --copy-dirlinks         transform symlink to a dir into referent dir
 -K, --keep-dirlinks         treat symlinked dir on receiver as dir
 -H, --hard-links            preserve hard links
 -p, --perms                 preserve permissions
 -E, --executability         preserve the file's executability
     --chmod=CHMOD           affect file and/or directory permissions
 -A, --acls                  preserve ACLs (implies --perms)
 -X, --xattrs                preserve extended attributes
 -o, --owner                 preserve owner (super-user only)
 -g, --group                 preserve group
     --devices               preserve device files (super-user only)
     --copy-devices          copy device contents as regular file
     --specials              preserve special files
 -D                          same as --devices --specials
 -t, --times                 preserve modification times
 -O, --omit-dir-times        omit directories from --times
     --super                 receiver attempts super-user activities
     --fake-super            store/recover privileged attrs using xattrs
 -S, --sparse                handle sparse files efficiently
 -n, --dry-run               perform a trial run with no changes made
 -W, --whole-file            copy files whole (without delta-xfer algorithm)
 -x, --one-file-system       don't cross filesystem boundaries
 -B, --block-size=SIZE       force a fixed checksum block-size
 -e, --rsh=COMMAND           specify the remote shell to use
     --rsync-path=PROGRAM    specify the rsync to run on the remote machine
     --existing              skip creating new files on receiver
     --ignore-existing       skip updating files that already exist on receiver
     --remove-source-files   sender removes synchronized files (non-dirs)
     --del                   an alias for --delete-during
     --delete                delete extraneous files from destination dirs
     --delete-before         receiver deletes before transfer, not during
     --delete-during         receiver deletes during the transfer
     --delete-delay          find deletions during, delete after
     --delete-after          receiver deletes after transfer, not during
     --delete-excluded       also delete excluded files from destination dirs
     --ignore-errors         delete even if there are I/O errors
     --force                 force deletion of directories even if not empty
     --max-delete=NUM        don't delete more than NUM files
     --max-size=SIZE         don't transfer any file larger than SIZE
     --min-size=SIZE         don't transfer any file smaller than SIZE
     --partial               keep partially transferred files
     --partial-dir=DIR       put a partially transferred file into DIR
     --delay-updates         put all updated files into place at transfer's end
 -m, --prune-empty-dirs      prune empty directory chains from the file-list
     --numeric-ids           don't map uid/gid values by user/group name
     --timeout=SECONDS       set I/O timeout in seconds
     --contimeout=SECONDS    set daemon connection timeout in seconds
 -I, --ignore-times          don't skip files that match in size and mod-time
     --size-only             skip files that match in size
     --modify-window=NUM     compare mod-times with reduced accuracy
 -T, --temp-dir=DIR          create temporary files in directory DIR
 -y, --fuzzy                 find similar file for basis if no dest file
     --compare-dest=DIR      also compare destination files relative to DIR
     --copy-dest=DIR         ... and include copies of unchanged files
     --link-dest=DIR         hardlink to files in DIR when unchanged
 -z, --compress              compress file data during the transfer
     --compress-level=NUM    explicitly set compression level
     --skip-compress=LIST    skip compressing files with a suffix in LIST
 -C, --cvs-exclude           auto-ignore files the same way CVS does
 -f, --filter=RULE           add a file-filtering RULE
 -F                          same as --filter='dir-merge /.rsync-filter'
                             repeated: --filter='- .rsync-filter'
     --exclude=PATTERN       exclude files matching PATTERN
     --exclude-from=FILE     read exclude patterns from FILE
     --include=PATTERN       don't exclude files matching PATTERN
     --include-from=FILE     read include patterns from FILE
     --files-from=FILE       read list of source-file names from FILE
 -0, --from0                 all *-from/filter files are delimited by 0s
 -s, --protect-args          no space-splitting; only wildcard special-chars
     --address=ADDRESS       bind address for outgoing socket to daemon
     --port=PORT             specify double-colon alternate port number
     --sockopts=OPTIONS      specify custom TCP options
     --blocking-io           use blocking I/O for the remote shell
     --stats                 give some file-transfer stats
 -8, --8-bit-output          leave high-bit chars unescaped in output
 -h, --human-readable        output numbers in a human-readable format
     --progress              show progress during transfer
 -P                          same as --partial --progress
 -i, --itemize-changes       output a change-summary for all updates
     --out-format=FORMAT     output updates using the specified FORMAT
     --log-file=FILE         log what we're doing to the specified FILE
     --log-file-format=FMT   log updates using the specified FMT
     --password-file=FILE    read daemon-access password from FILE
     --list-only             list the files instead of copying them
     --bwlimit=KBPS          limit I/O bandwidth; KBytes per second
     --write-batch=FILE      write a batched update to FILE
     --only-write-batch=FILE like --write-batch but w/o updating destination
     --read-batch=FILE       read a batched update from FILE
     --protocol=NUM          force an older protocol version to be used
     --iconv=CONVERT_SPEC    request charset conversion of filenames
 -4, --ipv4                  prefer IPv4
 -6, --ipv6                  prefer IPv6
     --version               print version number
(-h) --help                  show this help (-h is --help only if used alone)

Use "rsync --daemon --help" to see the daemon-mode command-line options.
Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation.
See http://rsync.samba.org/ for updates, bug reports, and answers