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
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/
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
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