GNU Bash

Bash

Tutorial Bash: Transferencia de archivos y comunicación remota con SSH

En este tutorial de Bash Shell, descubre cómo usar scp, rsync y ssh para transferir archivos y gestionar conexiones seguras con servidores remotos.

El comando scp

El comando scp (secure copy protocol) es una herramienta esencial dentro de los comandos Linux para la transferencia segura de archivos entre hosts en una red. scp utiliza el protocolo SSH para garantizar que los datos se transfieran de manera segura, lo que lo convierte en una opción confiable para la comunicación remota en entornos donde la seguridad es una prioridad.

El uso básico de scp implica la especificación de un archivo fuente y un destino. La sintaxis general es:

scp [opciones] fuente destino

Un ejemplo simple para copiar un archivo local a un servidor remoto sería:

scp archivo.txt usuario@servidor:/ruta/destino/

Aquí, archivo.txt es el archivo que se desea transferir, usuario es el nombre de usuario en el servidor remoto, servidor es la dirección del servidor, y /ruta/destino/ es la ruta en el servidor donde se almacenará el archivo.

Para copiar un archivo desde un servidor remoto a la máquina local, la sintaxis se invierte:

scp usuario@servidor:/ruta/origen/archivo.txt /ruta/local/

scp también permite copiar directorios completos. Esto se logra utilizando la opción -r para copiar de manera recursiva:

scp -r directorio/ usuario@servidor:/ruta/destino/

Es posible especificar un puerto SSH diferente al predeterminado (22) utilizando la opción -P:

scp -P 2222 archivo.txt usuario@servidor:/ruta/destino/

La opción -C permite comprimir los datos durante la transferencia, lo que puede ser útil para mejorar la velocidad en conexiones lentas:

scp -C archivo.txt usuario@servidor:/ruta/destino/

Para evitar la necesidad de ingresar la contraseña cada vez que se utiliza scp, es común configurar la autenticación mediante claves SSH. Esto se logra generando un par de claves SSH con ssh-keygen y añadiendo la clave pública al archivo ~/.ssh/authorized_keys del usuario remoto.

scp es una herramienta robusta para la transferencia de archivos en entornos donde la seguridad es crucial. Aunque scp es ampliamente utilizado, es importante notar que rsync puede ser preferible en situaciones donde la eficiencia y la capacidad de reanudar transferencias interrumpidas son críticas. Sin embargo, scp sigue siendo una opción rápida y sencilla para muchas tareas de transferencia de archivos en Bash script y Shell.

Uso de **sftp**

El comando sftp (SSH File Transfer Protocol) es una herramienta segura para la transferencia de archivos entre hosts en una red. sftp utiliza el protocolo SSH para garantizar que los datos se transfieran de manera segura, proporcionando una interfaz similar a FTP pero con conexiones cifradas. Se recomienda su uso sobre el comando scp debido a su mayor seguridad.

Uso básico de sftp:

sftp usuario@servidor

Una vez conectado, puedes utilizar comandos interactivos como:

  • Listar archivos en el servidor remoto:
sftp> ls
  • Subir un archivo al servidor remoto:
sftp> put archivo_local.txt /ruta/remota/
  • Descargar un archivo desde el servidor remoto:
sftp> get /ruta/remota/archivo_remoto.txt /ruta/local/
  • Salir de la sesión **sftp**:
sftp> exit

Transferencia no interactiva:

Para transferencias directas sin entrar en modo interactivo, puedes usar sftp en modo no interactivo:

  • Subir un archivo:
sftp usuario@servidor:/ruta/remota/ <<< $'put archivo_local.txt'
  • Descargar un archivo:
sftp usuario@servidor:/ruta/remota/archivo_remoto.txt /ruta/local/

El comando rsync

El comando rsync es una utilidad avanzada para la sincronización y transferencia de archivos en sistemas Unix/Linux. A diferencia de scp, rsync es capaz de realizar transferencias incrementales, lo que significa que solo los cambios en los archivos se transfieren, optimizando así el uso del ancho de banda y el tiempo de transferencia. Este comportamiento se logra mediante el uso de un algoritmo de suma de comprobación que detecta diferencias entre los archivos de origen y destino.

La sintaxis básica de rsync es la siguiente:

rsync [opciones] fuente destino

Un ejemplo típico de uso para sincronizar un directorio local con un directorio en un servidor remoto es:

rsync -avz /directorio/local/ usuario@servidor:/directorio/remoto/

En este ejemplo, las opciones -a, -v y -z se utilizan de la siguiente manera:

  • -a (archive) preserva las propiedades de los archivos (permisos, tiempos de modificación, etc.) y copia recursivamente directorios.
  • -v (verbose) proporciona información detallada sobre el proceso de transferencia.
  • -z (compress) comprime los datos durante la transferencia para mejorar la eficiencia.

Para copiar solo los archivos nuevos o modificados desde un servidor remoto a un directorio local, se puede usar:

rsync -avz usuario@servidor:/directorio/remoto/ /directorio/local/

rsync también permite excluir ciertos archivos o directorios de la sincronización mediante la opción --exclude. Por ejemplo, para excluir archivos temporales:

rsync -avz --exclude='*.tmp' /directorio/local/ usuario@servidor:/directorio/remoto/

Además, rsync soporta la reanudación de transferencias interrumpidas, lo cual es particularmente útil en conexiones inestables. Esto se logra con la opción --partial:

rsync -avz --partial /directorio/local/ usuario@servidor:/directorio/remoto/

La autenticación en rsync sobre SSH se gestiona de manera similar a scp, utilizando claves SSH para evitar ingresar contraseñas repetidamente. Esto se configura generando un par de claves SSH y añadiendo la clave pública al archivo ~/.ssh/authorized_keys del usuario remoto.

Una característica destacada de rsync es su capacidad para realizar transferencias en el modo "dry run" con la opción --dry-run, que permite simular la sincronización sin realizar cambios reales, útil para verificar qué archivos se transferirán:

rsync -avz --dry-run /directorio/local/ usuario@servidor:/directorio/remoto/

rsync es una herramienta fundamental en la administración de sistemas y scripts de Bash, especialmente cuando se requiere eficiencia en la transferencia de archivos y directorios en entornos de red. Su flexibilidad y capacidad para manejar múltiples escenarios de sincronización lo convierten en un componente esencial en la caja de herramientas de cualquier desarrollador que trabaje con Shell y comandos Linux.

El comando ssh y conexión con servidores

El comando ssh (secure shell) es una herramienta fundamental para establecer conexiones seguras con servidores remotos, permitiendo la ejecución remota de comandos y la administración de sistemas de manera segura. Utiliza el protocolo SSH para cifrar las comunicaciones y autenticar a los usuarios, siendo una opción segura para la interacción remota en Linux y la ejecución de scripts de Bash.

La sintaxis básica para establecer una conexión SSH es:

ssh usuario@servidor

Aquí, usuario es el nombre de usuario en el servidor remoto y servidor es la dirección IP o el nombre de dominio del servidor. Una vez ejecutado, ssh solicitará la contraseña del usuario, a menos que se haya configurado la autenticación mediante claves SSH.

Para especificar un puerto diferente al predeterminado (22), usa la opción -p:

ssh -p 2222 usuario@servidor

La autenticación mediante claves SSH es preferida por su seguridad y conveniencia. Para configurarla, primero genera un par de claves SSH en la máquina local:

ssh-keygen -t rsa -b 4096

Por defecto, las claves se almacenan en ~/.ssh/id_rsa (clave privada) y ~/.ssh/id_rsa.pub (clave pública). La clave pública debe copiarse al archivo ~/.ssh/authorized_keys del usuario en el servidor remoto. Esto se puede hacer fácilmente con el comando ssh-copy-id:

ssh-copy-id usuario@servidor

Una vez configurada, podrás conectarte al servidor sin necesidad de proporcionar una contraseña cada vez.

ssh también permite la ejecución remota de comandos directamente desde la línea de comandos, sin necesidad de iniciar una sesión interactiva:

ssh usuario@servidor 'comando_remoto'

Por ejemplo, para listar el contenido del directorio /var/log en un servidor remoto:

ssh usuario@servidor 'ls /var/log'

Además, ssh puede redirigir puertos, permitiendo el acceso a servicios en el servidor remoto a través de un túnel seguro. La redirección de puertos locales se realiza con la opción -L:

ssh -L 8080:localhost:80 usuario@servidor

Esto redirige el puerto 80 del servidor remoto al puerto 8080 de la máquina local, permitiendo acceder a servicios web en el servidor a través de http://localhost:8080.

La opción -N permite establecer un túnel SSH sin ejecutar comandos remotos, útil para la redirección de puertos:

ssh -N -L 8080:localhost:80 usuario@servidor

ssh es una herramienta esencial para cualquier desarrollador que trabaje con Shell y Bash script, proporcionando una base segura para la administración remota de sistemas y la ejecución de comandos en entornos de servidores.

Certifícate en Bash con CertiDevs PLUS

Ejercicios de esta lección Transferencia de archivos y comunicación remota con SSH

Evalúa tus conocimientos de esta lección Transferencia de archivos y comunicación remota con SSH con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de Bash

Accede a todas las lecciones de Bash y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Principales Distribuciones De Linux

GNU Bash

Introducción Y Entorno

Instalar Ubuntu En Windows Con Wsl

GNU Bash

Introducción Y Entorno

Introducción A Shell Y Bash

GNU Bash

Introducción Y Entorno

Comandos De Navegación Pwd, Cd Y Ls

GNU Bash

Navegación Y Gestión De Archivos Y Directorios

Manipulación De Archivos Y Directorios

GNU Bash

Navegación Y Gestión De Archivos Y Directorios

Comprimir Y Descomprimir Archivos En Bash Con Tar Y Gzip

GNU Bash

Navegación Y Gestión De Archivos Y Directorios

Manipulación De Permisos De Archivos Y Directorios Con Chmod, Chown Y Chgrp

GNU Bash

Navegación Y Gestión De Archivos Y Directorios

Enlaces Simbólicos Y Duros

GNU Bash

Navegación Y Gestión De Archivos Y Directorios

Redirección Y Tuberías

GNU Bash

Navegación Y Gestión De Archivos Y Directorios

Gestión De Procesos Con Ps, Htop Y Pgrep

GNU Bash

Gestión De Procesos Y Servicios

Gestión De Servicios Con Systemd

GNU Bash

Gestión De Procesos Y Servicios

Configuración De Bash

GNU Bash

Interacción Con El Sistema

Redes Y Comunicación Con Ifconfig, Ip Y Netstat

GNU Bash

Interacción Con El Sistema

Transferencia De Archivos Y Comunicación Remota Con Ssh

GNU Bash

Interacción Con El Sistema

Gestión De Paquetes Y Dependencias Y Actualización Del Sistema

GNU Bash

Interacción Con El Sistema

Variables Y Tipos De Datos

GNU Bash

Sintaxis Y Creación De Scripts En Bash

Operadores

GNU Bash

Sintaxis Y Creación De Scripts En Bash

Sintaxis De Control De Flujo

GNU Bash

Sintaxis Y Creación De Scripts En Bash

Expresiones Regulares Y Manipulación De Texto

GNU Bash

Sintaxis Y Creación De Scripts En Bash

Definición Y Uso De Funciones

GNU Bash

Sintaxis Y Creación De Scripts En Bash

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender el uso y diferencias entre scp y rsync para transferir archivos en Bash.
  • Configurar autenticación SSH mediante claves para mejorar la seguridad en las conexiones.
  • Realizar trasferencias seguras de archivos entre sistemas utilizando scp y rsync.
  • Ejecutar comandos y administrar servidores remotos utilizando ssh.
  • Aplicar técnicas de compresión y optimización en la transferencia de datos.
  • Establecer túneles SSH para redirección segura de puertos.