Guía de migración del usuario de SCP a rsync

Como parte de la anuncio de prelanzamiento 8.0, el proyecto OpenSSH declaró que consideran que el protocolo scp está desactualizado, es inflexible y no se repara fácilmente. Luego continúan recomendando el uso de sftp o rsync para la transferencia de archivos.

Sin embargo, muchos usuarios crecieron con el comando scp y, por lo tanto, no están familiarizados con rsync. Además, rsync puede hacer mucho más que simplemente copiar archivos, lo que puede dar a un principiante la impresión de que es complicado y opaco. Especialmente cuando, en términos generales, las banderas scp se asignan directamente a las banderas cp mientras que las banderas rsync no lo hacen.

Este artículo proporcionará una introducción y una guía de transición para cualquiera que esté familiarizado con scp. Pasemos a los escenarios más comunes: Copiar archivos y Copiar directorios.

Copiando documentos

Para copiar un solo archivo, los comandos scp y rsync son efectivamente equivalentes. Digamos que necesita enviar foo.txt a su directorio de inicio en un servidor llamado servidor.

                      $ scp foo.txt [email protected]:/home/me/
                    

El comando rsync equivalente solo requiere que escriba rsync en lugar de scp:

                      $ rsync foo.txt [email protected]:/home/me/
                    

Copiar directorios

Para copiar directorios, las cosas difieren bastante y probablemente explican por qué rsync se considera más complejo que scp. Si desea copiar la barra de directorios al servidor, el comando scp correspondiente se ve exactamente como el comando cp, excepto por la especificación de información ssh:

                      $ scp -r bar/ [email protected]:/home/me/
                    

Con rsync, hay más consideraciones, ya que es una herramienta más poderosa. Primero, veamos la forma más simple:

                      $ rsync -r bar/ [email protected]:/home/me/
                    

Parece simple, ¿verdad? Para el caso simple de un directorio que contiene solo directorios y archivos normales, esto funcionará. Sin embargo, rsync se preocupa mucho por enviar archivos exactamente como están en el sistema host. Vamos a crear un poco más complejo, pero no poco común, example.

                      # Create a multi-level directory structure
$ mkdir -p bar/baz
# Create a file at the root directory
$ touch bar/foo.txt
# Now create a symlink which points back up to this file
$ cd bar/baz
$ ln -s ../foo.txt link.txt
# Return to our original location
$ cd -
                    

Ahora tenemos un árbol de directorios que se parece a lo siguiente:

                      bar
├── baz
│   └── link.txt -> ../foo.txt
└── foo.txt

1 directory, 2 files
                    

Si probamos los comandos de arriba para copiar la barra, notaremos resultados muy diferentes (y sorprendentes). Primero, probemos scp:

                      $ scp -r bar/ [email protected]:/home/me/
                    

Si ingresa a su servidor y observa el árbol de directorios de la barra, notará una diferencia importante y sutil con respecto a su sistema host:

                      bar
├── baz
│   └── link.txt
└── foo.txt

1 directory, 2 files
                    

Tenga en cuenta que link.txt ya no es un enlace simbólico. Ahora es una copia completa de foo.txt. Este podría ser un comportamiento sorprendente si estás acostumbrado a cp. Si intentara copiar el directorio de la barra usando cp -r, obtendría un nuevo directorio con los enlaces simbólicos exactos que tenía esa barra. Ahora, si probamos el mismo comando rsync de antes, recibiremos una advertencia:

                      $ rsync -r bar/ [email protected]:/home/me/
skipping non-regular file "bar/baz/link.txt"
                    

Rsync nos advirtió que encontró un archivo no regular y lo está saltando. Como no le dijiste que copiara los enlaces simbólicos, los está ignorando. Rsync tiene una extensa sección de manual titulada “ENLACES SIMBÓLICOS” que explica todas las posibles opciones de comportamiento disponibles para usted. Para nuestro examplenecesitamos agregar el indicador –links.

                      $ rsync -r --links bar/ [email protected]:/home/me/
                    

En el servidor remoto vemos que el enlace simbólico se copió como un enlace simbólico. Tenga en cuenta que esto es diferente de cómo scp copió el enlace simbólico.

                      bar/
├── baz
│   └── link.txt -> ../foo.txt
└── foo.txt

1 directory, 2 files
                    

Para ahorrar algo de escritura y aprovechar más opciones de conservación de archivos, use el indicador –archive (-a para abreviar) cada vez que copie un directorio. El indicador de archivo hará lo que la mayoría de la gente espera, ya que permite la copia recursiva, la copia de enlace simbólico y muchas otras opciones.

                      $ rsync -a bar/ [email protected]:/home/me/
                    

La página de manual de rsync tiene explicaciones detalladas de lo que habilita el indicador de archivo si tiene curiosidad.

Advertencias

Sin embargo, hay una advertencia al usar rsync. Es mucho más fácil especificar un puerto ssh no estándar con scp que con rsync. Si el servidor estuviera usando conexiones SSH del puerto 8022, por ejemplo, esos comandos se verían así:

                      $ scp -P 8022 foo.txt [email protected]:/home/me/
                    

Con rsync, debe especificar el comando “remote shell” para usar. Esto por defecto es ssh. Lo haces usando la bandera -e.

                      $ rsync -e 'ssh -p 8022' foo.txt [email protected]:/home/me/
                    

Rsync usa tu configuración ssh; sin embargo, si se conecta a este servidor con frecuencia, puede agregar el siguiente fragmento a su archivo ~/.ssh/config. ¡Entonces ya no necesitará especificar el puerto para los comandos rsync o ssh!

                      Host server
    Port 8022
                    

Como alternativa, si todos los servidores a los que se conecta se ejecutan en el mismo puerto no estándar, puede configurar la variable de entorno RSYNC_RSH.

¿Por qué más debería cambiar a rsync?

Ahora que hemos cubierto los casos de uso diario y las advertencias para cambiar de scp a rsync, tomemos un tiempo para explorar por qué probablemente desee usar rsync por sus propios méritos. Mucha gente ha hecho el cambio a rsync hace mucho tiempo solo por estos méritos.

Compresión en vuelo

Si tiene una conexión de red lenta o limitada entre usted y su servidor, rsync puede gastar más ciclos de CPU para ahorrar ancho de banda de red. Lo hace comprimiendo los datos antes de enviarlos. La compresión se puede habilitar con el indicador -z.

Transferencias Delta

Rsync también solo copia un archivo si el archivo de destino es diferente al archivo de origen. Esto funciona recursivamente a través de directorios. Por ejemplo, si tomó nuestra barra final example arriba y volvió a ejecutar ese comando rsync varias veces, no funcionaría después de la transferencia inicial. Vale la pena usar rsync incluso para copias locales si sabe que las repetirá, como hacer una copia de seguridad en una unidad USB, solo por esta función, ya que puede ahorrar mucho tiempo con grandes conjuntos de datos.

Sincronizando

Como su nombre lo indica, rsync puede hacer más que solo copiar datos. Hasta ahora, solo hemos demostrado cómo copiar archivos con rsync. Si, en cambio, desea que rsync haga que el directorio de destino se parezca a su directorio de origen, puede agregar el indicador –delete a rsync. El indicador de eliminación hace que rsync copie archivos del directorio de origen que no existen en el directorio de destino. Luego eliminará archivos en el directorio de destino que no existen en el directorio de origen. El resultado es que el directorio de destino es idéntico al directorio de origen. Por el contrario, scp solo agregará archivos al directorio de destino.

Conclusión

Para casos de uso simples, rsync no es significativamente más complicado que la venerable herramienta scp. La única diferencia significativa es el uso de -a en lugar de -r para la copia recursiva de directorios. Sin embargo, como vimos, el indicador -a de rsync se comporta más como el indicador -r de cp que el indicador -r de scp.

Con suerte, con estos nuevos comandos, puede acelerar su flujo de trabajo de transferencia de archivos.

Related Posts