Transferir archivos entre máquinas Linux sobre SSH
Resumen
A veces queremos transferir archivos de una máquina Linux a otra de forma segura. Quizás queramos subir algunos archivos a un servidor de producción o hacer una copia de seguridad.
En este artículo, veremos diferentes herramientas para transferir archivos entre máquinas Linux a través de ssh, el protocolo más popular para la conexión remota entre máquinas Linux.
Veremos las dos herramientas de transferencia de archivos más populares: scp y rsync.
Uso básico de las herramientas
2.1. Un ejemplo rápido
Imaginemos que queremos copiar el archivo text.log desde nuestro sistema local a la ruta /var/log en un servidor Linux remoto en la dirección IP 111.111.111.111, y queremos utilizar las credenciales del usuario root.
Esto se puede conseguir con scp o rsync utilizando la misma sintaxis básica:
scp text.log :/var/logrsync text.log :/var/log
Entendamos lo que tienen en común estos comandos antes de conocer sus variaciones y diferencias.
2.2. La sintaxis general
La sintaxis general de scp o rsync es:
scp/rsync ]Source_File ]Destination_file
La sección OPTION nos permite utilizar interruptores de línea de comandos para modificar el comportamiento de la operación de copia. Las dos rutas para el origen y el destino nos permiten especificar la ruta del archivo en ambos lados de la operación de copia, así como la(s) cuenta(s) de usuario a utilizar.
En el ejemplo anterior, el archivo local se copia a una ubicación remota – . Como veremos más adelante, podemos utilizar el formato remoto para describir el origen o el destino, lo que permite que estos comandos sirvan tanto para subir archivos a un servidor como para descargar archivos de un servidor.
2.3. Cosas importantes a tener en cuenta
Hay pocos puntos a recordar cuando estamos transfiriendo archivos por ssh usando cualquier herramienta:
- El comando scp/rsync nos pedirá la contraseña del usuario para iniciar sesión en el servidor remoto si no tenemos configurado el inicio de sesión automático mediante el intercambio de claves RSA
- No necesitamos proporcionar nuestro nombre de usuario o la IP del servidor para nuestro servidor local
- Podemos proporcionar una ruta absoluta o una ruta relativa al archivo de origen/destino, donde las rutas relativas son relativas al directorio de trabajo actual o al directorio raíz del usuario remoto
2.4. Especificar un nombre de archivo
No es obligatorio proporcionar un nombre de archivo en la ruta de destino. Si no proporcionamos un nombre de archivo, se utilizará el nombre del archivo de origen.
En nuestro primer ejemplo, el archivo se creará en el directorio de destino con el nombre text.log. Si hubiéramos querido que el archivo se almacenara con un nombre diferente, podríamos haber proporcionado un nombre de archivo como parte de la ruta de destino.
Usando el nombre de archivo implícito, podemos copiar un archivo del servidor Linux remoto en el directorio actual con su nombre original:
scp :/var/log/text.log .rsync :/var/log/text.log .
Aquí, el parámetro «.» representa el directorio de trabajo actual. También podemos proporcionar una ruta diferente si queremos:
scp :/var/log/text.log /opt/path/mytextlog.logrsync :/var/log/text.log /opt/path/mytextlog.log
2.5. Copiar entre servidores
Incluso podemos utilizar estas herramientas para copiar entre dos servidores remotos. Por ejemplo, copiemos el archivo text.log del servidor 111.111.111.111. al servidor 222.222.222 para el usuario root:
scp :/var/log/text.log :/var/logrsync :/var/log/text.log :/var/log
Ahora que tenemos un conocimiento básico de scp y rsync, vamos a verlos con más profundidad.
scp (Secure Copy)
scp significa Secure Copy y se utiliza para transferir archivos a través de una conexión ssh. Es una copia en bruto, es decir, sólo leerá los datos de la carpeta de origen y los escribirá en la carpeta de destino. Por lo tanto, si buscamos una copia rápida que no debería tardar más de unos minutos, entonces deberíamos optar por scp.
Si estamos transfiriendo un archivo grande, deberíamos asegurarnos de que tenemos una conexión a Internet estable. Como el scp no es reanudable, se puede perder tiempo si la conexión se cae durante una transferencia grande, y habrá que reiniciar toda la operación de copia.
3.1. Instalación
La mayoría de las distribuciones de Linux vienen con scp preinstalado. Podemos comprobar fácilmente si scp está instalado o no:
which scp
Veremos la ruta del comando scp si ya está instalado. Una respuesta vacía significa que scp no está instalado.
Si no lo tenemos ya, entonces para instalar scp, tenemos que instalar el paquete cliente OpenSSH desde el repositorio oficial de paquetes:
sudo apt-get install openssh-clients # For Debian based systems like Ubuntu sudo yum install openssh-clients # For Red Hat based systems like CentOS and Fedora
Vamos a repasar algunos escenarios comunes para usar scp.
3.2. Transferir múltiples archivos
Podemos proporcionar una lista de archivos separados por espacios para transferir múltiples archivos:
scp text.log text1.log text2.log :/var/log
También podemos utilizar la opción -r para copiar todo el directorio de forma recursiva. Por ejemplo, para copiar todos los archivos del directorio /home/app/log/:
scp -r /home/app/log :/var/log
Podemos usar * para enviar los archivos que coincidan con un patrón de nombre concreto. Por ejemplo, tenemos cuatro archivos text.log, text2.log, app.log y app2.log, y queremos enviar sólo los archivos que empiecen por app:
scp /home/app/log/app* :/var/log
3.3. Transferir archivos usando archivos de identidad
En la mayoría de las distribuciones de Linux se prefiere la autenticación basada en claves. En el comando scp, podemos especificar el archivo de identidad utilizando la opción -i:
scp -i key.pem text.log :/var/log
Muchos administradores de sistemas utilizan la autenticación basada en claves para transferir archivos ya que no requiere las credenciales del usuario en cada transferencia.
3.4. Compresión sobre la marcha
Podemos reducir el tiempo de transferencia utilizando la compresión sobre la marcha con la opción -C. Esto comprimirá y descomprimirá el archivo en las rutas de origen y destino respectivamente:
scp -C text.log :/var/log
3.5. Limitar el ancho de banda durante la transferencia
Podemos especificar el ancho de banda en Kbit/s con la opción -l:
scp -l 500 text.log :/var/log
3.6. Modo verbose para depuración
Podemos habilitar el modo verbose con la opción -v:
scp -v text.log :/var/log
La salida sería algo así:
Executing: program /usr/bin/ssh host prod-reporting-b, user jain, command scp -v -t /tmp OpenSSH_7.9p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 48: Applying options for * debug1: Connecting to prod-reporting-b port 22. debug1: Connection established. ------ Transferred: sent 2856, received 2932 bytes, in 2.1 seconds Bytes per second: sent 1366.8, received 1403.1 debug1: Exit status 0
La salida verbose (debug) imprime los pasos exactos que scp está ejecutando, lo cual es útil para depurar conexiones, autenticación y problemas de configuración.
rsync (Sincronización remota)
rsync es rápido y versátil. Es bueno para sincronizar y transferir archivos de forma inteligente, ya que hace un seguimiento de cuántos datos se han copiado y cuántos quedan.
Debemos utilizar rsync cuando tengamos archivos grandes que transferir: aunque haya problemas de conexión a la red, los datos copiados hasta ese momento no se perderán, y cuando se restablezca la conexión, la copia se reanudará desde ese punto.
rsync es más rápido que el comando scp cuando tenemos que transferir el mismo archivo varias veces, ya que utiliza un protocolo de actualización remota, que permite transferir sólo las diferencias entre dos conjuntos de archivos.
4.1. Instalación
Comprobemos si rsync está instalado invocándolo para que nos muestre su versión:
rsync --version
Si nos da error, entonces podemos instalarlo:
sudo apt-get install rsync # For Debian based systems like Ubuntu sudo yum install rsync # For Red Hat based systems like CentOS and Fedora
Veamos algunos escenarios comunes en los que podemos utilizar rsync.
4.2. Hacer una ejecución en seco
Dado que rsync es tan potente, puede ser peligroso utilizarlo sin comprobar lo que va a hacer. Afortunadamente, rsync proporciona la opción -dry-run, que realiza una ejecución de prueba sin transferir realmente los archivos:
rsync --dry-run text.log :/var/log
4.3. Copiar atributos y metadatos
rsync proporciona la opción -a, que copia los enlaces simbólicos, las horas de modificación, el grupo, la propiedad y los permisos junto con el contenido del archivo.
Otra opción importante es -h, que imprimirá la salida de forma legible para los humanos. Esto puede ser especialmente útil cuando se ejecuta junto con la opción -dry-run:
rsync -ah --dry-run text.log :/var/log
4.4. Transferir múltiples archivos en un directorio
Podemos proporcionar una lista de archivos separados por un espacio para transferir múltiples archivos:
rsync text.log text1.log text2.log :/var/log
La opción -r copia recursivamente todos los archivos dentro del directorio:
rsync -r /home/app/log :/var/log
El operador * envía los archivos que coinciden con un patrón determinado:
rsync /home/app/log/app* :/var/log
Podemos utilizar la opción -include y la opción -exclude para incluir y excluir archivos de la lista de archivos dentro del directorio. Por ejemplo, para enviar todos los archivos de un directorio excluyendo los que empiezan por ‘R’:
rsync --include '*' --exclude 'R*' text.log :/urs/log
4.5. Compresión sobre la marcha
Podemos reducir el tiempo de transferencia utilizando la compresión sobre la marcha con la opción -z. Esto comprimirá y descomprimirá el archivo en las rutas de origen y destino respectivamente:
rsync -z text.log :/var/log
4.6. Eliminar los archivos existentes en la ruta de destino antes de la transferencia
La opción -delete elimina los archivos existentes del destino antes de transferir los nuevos archivos:
rsync --delete text.log :/var/log
4.7. Eliminar automáticamente los archivos de origen después de la transferencia
Digamos que queremos tomar una copia de seguridad de los registros del servidor de producción a un servidor de copia de seguridad. En este escenario, probablemente nos gustaría eliminar los archivos del servidor de producción después de transferir todos los archivos a nuestro servidor de copia de seguridad.
El servidor rsync proporciona la opción -remove-source-files para eliminar los archivos de origen después de que la transferencia se haya completado:
rsync --remove-source-files text.log :/var/log
¿Qué herramienta elegir?
Podemos utilizar ambas herramientas para transferir archivos entre máquinas Linux. Sin embargo, debemos considerar scp cuando el tamaño del archivo es pequeño – es una herramienta de copia simple y está ampliamente disponible. En nuestro uso cotidiano, scp es la opción fácil para transferencias pequeñas y puntuales.
Nos beneficiaríamos más de rsync cuando el tamaño de los archivos es grande o cuando necesitamos una sincronización más compleja y eficiente. También es la mejor opción para tareas recurrentes como trabajos cron y scripts.
Conclusión
En este artículo, hemos visto dos herramientas de transferencia de archivos: scp y rsync.
También hemos visto las diferencias entre ellas, y qué herramientas se ajustan a ciertos casos de uso.