Transferencia de archivos con ordenadores remotos

Última actualización: 2025-08-04 | Mejora esta página

Hoja de ruta

Preguntas

  • ¿Cómo transfiero archivos a (y desde) el cluster?

Objetivos

  • Transfiere archivos hacia y desde un clúster informático.

Realizar trabajo en un ordenador remoto no es muy útil si no podemos obtener ficheros hacia o desde el cluster. Existen varias opciones para transferir datos entre recursos informáticos utilizando utilidades CLI y GUI, algunas de las cuales veremos a continuación.

Descargar archivos de lecciones de Internet


Una de las formas más sencillas de descargar archivos es utilizar curl o wget. Uno de ellos suele estar instalado en la mayoría de los shells de Linux, en el terminal de Mac OS y en GitBash. Cualquier archivo que pueda descargarse en su navegador web a través de un enlace directo puede descargarse utilizando curl o wget. Esta es una forma rápida de descargar conjuntos de datos o código fuente. La sintaxis de estos comandos es

  • wget [-O new_name] https://some/link/to/a/file
  • curl [-o new_name] https://some/link/to/a/file

Pruébalo descargando algún material que usaremos más adelante, desde un terminal en tu máquina local, usando la URL de la base de código actual:

https://github.com/hpc-carpentry/amdahl/tarball/main

Descarga el “Tarball”

La palabra “tarball” en la URL anterior se refiere a un formato de archivo comprimido comúnmente utilizado en Linux, que es el sistema operativo que ejecutan la mayoría de las máquinas de clúster HPC. Un tarball es muy parecido a un archivo .zip. La extensión real del archivo es .tar.gz, que refleja el proceso en dos etapas utilizado para crearlo: los archivos o carpetas se fusionan en un único archivo utilizando tar, que luego se comprime utilizando gzip, por lo que la extensión del archivo es “tar-dot-g-z” Es un trabalenguas, así que la gente suele decir “el tarball xyz” en su lugar.

También puede ver la extensión .tgz, que no es más que una abreviatura de .tar.gz.

Por defecto, curl y wget descargan los archivos con el mismo nombre que la URL: en este caso, main. Utilice uno de los comandos anteriores para guardar el tarball como amdahl.tar.gz.

BASH

[you@laptop:~]$ wget -O amdahl.tar.gz https://github.com/hpc-carpentry/amdahl/tarball/main
# or
[you@laptop:~]$ curl -o amdahl.tar.gz -L https://github.com/hpc-carpentry/amdahl/tarball/main

La opción -L para curl le dice que siga las redirecciones URL (lo que wget hace por defecto).

Después de descargar el archivo, utilice ls para verlo en su directorio de trabajo:

BASH

[you@laptop:~]$ ls

Archivar ficheros


Uno de los mayores retos a los que nos enfrentamos a menudo cuando transferimos datos entre sistemas HPC remotos es el de un gran número de archivos. Hay una sobrecarga en la transferencia de cada archivo individual y cuando estamos transfiriendo un gran número de archivos estas sobrecargas se combinan para ralentizar nuestras transferencias en gran medida.

La solución a este problema es archivar múltiples ficheros en números más pequeños de ficheros más grandes antes de transferir los datos para mejorar nuestra eficiencia de transferencia. A veces combinaremos el archivado con la compresión para reducir la cantidad de datos que tenemos que transferir y así acelerar la transferencia. El comando de archivado más común en un cluster HPC (Linux) es tar.

tar puede utilizarse para combinar ficheros y carpetas en un único fichero de archivo y, opcionalmente, comprimir el resultado. Veamos el archivo que descargamos del sitio de la lección, amdahl.tar.gz.

La parte .gz significa gzip, que es una biblioteca de compresión. Es común (¡pero no necesario!) que este tipo de archivo pueda interpretarse leyendo su nombre: parece que alguien tomó archivos y carpetas relacionados con algo llamado “amdahl”, los envolvió todos en un único archivo con tar, y luego comprimió ese archivo con gzip para ahorrar espacio.

Veamos si es el caso, sin descomprimir el archivo. tar imprime el “table de contenidos” con la bandera -t, para el fichero especificado con la bandera -f seguido del nombre del fichero. Tenga en cuenta que puede concatenar las dos banderas: escribir -t -f es intercambiable con escribir -tf juntas. Sin embargo, el argumento que sigue a -f debe ser un nombre de fichero, por lo que escribir -ft no funcionará.

BASH

[you@laptop:~]$ tar -tf amdahl.tar.gz
hpc-carpentry-amdahl-46c9b4b/
hpc-carpentry-amdahl-46c9b4b/.github/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/python-publish.yml
hpc-carpentry-amdahl-46c9b4b/.gitignore
hpc-carpentry-amdahl-46c9b4b/LICENSE
hpc-carpentry-amdahl-46c9b4b/README.md
hpc-carpentry-amdahl-46c9b4b/amdahl/
hpc-carpentry-amdahl-46c9b4b/amdahl/__init__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/__main__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/amdahl.py
hpc-carpentry-amdahl-46c9b4b/requirements.txt
hpc-carpentry-amdahl-46c9b4b/setup.py

Este ejemplo muestra una carpeta que contiene algunos archivos, donde 46c9b4b es un hash de confirmación git de 8 caracteres que cambiará cuando se actualice el material fuente.

Ahora vamos a descomprimir el archivo. Ejecutaremos tar con algunas banderas comunes:

  • -x para extraer el archivo
  • -v para una salida verbosa
  • -z para compresión gzip
  • -f «tarball» para el fichero a descomprimir

Extraer el archivo

Usando las banderas de arriba, desempaquete el tarball del código fuente en un nuevo directorio llamado “amdahl” usando tar.

BASH

[you@laptop:~]$ tar -xvzf amdahl.tar.gz

SALIDA

hpc-carpentry-amdahl-46c9b4b/
hpc-carpentry-amdahl-46c9b4b/.github/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/python-publish.yml
hpc-carpentry-amdahl-46c9b4b/.gitignore
hpc-carpentry-amdahl-46c9b4b/LICENSE
hpc-carpentry-amdahl-46c9b4b/README.md
hpc-carpentry-amdahl-46c9b4b/amdahl/
hpc-carpentry-amdahl-46c9b4b/amdahl/__init__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/__main__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/amdahl.py
hpc-carpentry-amdahl-46c9b4b/requirements.txt
hpc-carpentry-amdahl-46c9b4b/setup.py

Observe que no necesitamos teclear -x -v -z -f, gracias a la concatenación de banderas, aunque el comando funciona de forma idéntica de cualquier forma – siempre que la lista concatenada termine con f, porque la siguiente cadena debe especificar el nombre del fichero a extraer.

La carpeta tiene un nombre desafortunado, así que cambiémoslo por algo más conveniente.

BASH

[you@laptop:~]$ mv hpc-carpentry-amdahl-46c9b4b amdahl

Comprueba el tamaño del directorio extraído y compáralo con el tamaño del archivo comprimido, utilizando du para “disk usage”.

BASH

[you@laptop:~]$ du -sh amdahl.tar.gz
8.0K     amdahl.tar.gz
[you@laptop:~]$ du -sh amdahl
48K    amdahl

Los archivos de texto (incluido el código fuente de Python) se comprimen muy bien: ¡el “tarball” es una sexta parte del tamaño total de los datos en bruto!

Si desea invertir el proceso – comprimir los datos en bruto en lugar de extraerlos – establezca una bandera c en lugar de x, establezca el nombre del fichero de archivo, y luego proporcione un directorio para comprimir:

BASH

[you@laptop:~]$ tar -cvzf compressed_code.tar.gz amdahl

SALIDA

amdahl/
amdahl/.github/
amdahl/.github/workflows/
amdahl/.github/workflows/python-publish.yml
amdahl/.gitignore
amdahl/LICENSE
amdahl/README.md
amdahl/amdahl/
amdahl/amdahl/__init__.py
amdahl/amdahl/__main__.py
amdahl/amdahl/amdahl.py
amdahl/requirements.txt
amdahl/setup.py

Si das amdahl.tar.gz como nombre de fichero en el comando anterior, tar actualizará el tarball existente con cualquier cambio que hayas hecho en los ficheros. Eso significaría añadir la nueva carpeta amdahl a la carpeta existente (hpc-carpentry-amdahl-46c9b4b) dentro del tarball, ¡duplicando el tamaño del archivo!

Trabajando con Windows

Cuando transfieres ficheros de texto de un sistema Windows a un sistema Unix (Mac, Linux, BSD, Solaris, etc.) esto puede causar problemas. Windows codifica sus ficheros de forma ligeramente diferente a Unix, y añade un carácter extra a cada línea.

En un sistema Unix, cada línea de un archivo termina con una \n (nueva línea). En Windows, cada línea de un archivo termina con \r\n (retorno de carro + nueva línea). Esto a veces causa problemas.

Aunque la mayoría de los lenguajes de programación y software modernos manejan esto correctamente, en algunos casos raros, puede encontrarse con un problema. La solución es convertir un archivo de Windows a la codificación Unix con el comando dos2unix.

Puede identificar si un fichero tiene terminaciones de línea Windows con cat -A filename. Un fichero con terminaciones de línea Windows tendrá ^M$ al final de cada línea. Un fichero con terminaciones de línea Unix tendrá $ al final de cada línea.

Para convertir el archivo, basta con ejecutar dos2unix filename. (A la inversa, para volver a convertirlo al formato de Windows, puede ejecutar unix2dos filename)

Transferencia de archivos y carpetas con scp


Para copiar un único fichero hacia o desde el cluster, podemos utilizar scp (“copia segura”). La sintaxis puede resultar un poco compleja para los nuevos usuarios, pero vamos a desglosarla. El comando scp es un pariente del comando ssh que utilizamos para acceder al sistema, y puede utilizar el mismo mecanismo de autenticación de clave pública.

Para cargar a otro ordenador, el comando de plantilla es

BASH

[you@laptop:~]$ scp local_file yourUsername@cluster.hpc-carpentry.org:remote_destination

en el que @ y : son separadores de campo y remote_destination es una ruta relativa a su directorio personal remoto, o un nuevo nombre de fichero si desea cambiarlo, o ambos una ruta relativa y un nuevo nombre de fichero. Si no tiene una carpeta específica en mente, puede omitir remote_destination y el archivo se copiará a su directorio personal en el ordenador remoto (con su nombre original). Si incluye remote_destination, tenga en cuenta que scp lo interpreta de la misma forma que cp cuando hace copias locales: si existe y es una carpeta, el fichero se copia dentro de la carpeta; si existe y es un fichero, el fichero se sobrescribe con el contenido de local_file; si no existe, se asume que es un nombre de fichero de destino para local_file.

Sube el material de la lección a tu directorio personal remoto de esta forma:

BASH

[you@laptop:~]$ scp amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:

¿Por qué no descargar en HPC Carpentry’s Cloud Cluster directamente?

La mayoría de los clusters de ordenadores están protegidos de la Internet abierta por un firewall. Para mejorar la seguridad, algunos están configurados para permitir el tráfico entrante, pero no saliente. Esto significa que un usuario autentificado puede enviar un fichero a una máquina del cluster, pero una máquina del cluster no puede recuperar ficheros de la máquina de un usuario o de la Internet abierta.

Intente descargar el archivo directamente. Tenga en cuenta que puede fallar, ¡y no pasa nada!

BASH

[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org
[yourUsername@login1 ~] wget -O amdahl.tar.gz https://github.com/hpc-carpentry/amdahl/tarball/main
# or
[yourUsername@login1 ~] curl -o amdahl.tar.gz https://github.com/hpc-carpentry/amdahl/tarball/main

¿Por qué no descargar en HPC Carpentry’s Cloud Cluster directamente? (continued)

¿Funcionó? Si no, ¿qué te dice la salida del terminal sobre lo que ha pasado?

Transferir un directorio


Para transferir un directorio entero, añadimos la bandera -r para “recursivo”: copia el elemento especificado, y cada elemento por debajo de él, y cada elemento por debajo de esos… hasta que llegue al fondo del árbol de directorios enraizado en el nombre de carpeta que proporcionaste.

BASH

[you@laptop:~]$ scp -r amdahl yourUsername@cluster.hpc-carpentry.org:

Precaución

Para un directorio grande – ya sea en tamaño o en número de ficheros – copiar con -r puede tardar mucho tiempo en completarse.

Cuando utilice scp, habrá notado que : siempre sigue al nombre del ordenador remoto. Una cadena después de : especifica el directorio remoto al que desea transferir el archivo o carpeta, incluyendo un nuevo nombre si desea renombrar el material remoto. Si deja este campo en blanco, scp por defecto será su directorio personal y el nombre del material local a transferir.

En los ordenadores Linux, / es el separador en las rutas de archivos o directorios. Una ruta que comienza con / se llama absoluta, ya que no puede haber nada por encima de la raíz /. Una ruta que no empieza por / se llama relativa, ya que no está anclada a la raíz.

Si quiere subir un fichero a una ubicación dentro de su directorio personal – lo que suele ser el caso – entonces no necesita un / líder. Después de :, puede escribir la ruta de destino relativa a su directorio personal. Si su directorio personal es el destino, puede dejar el campo de destino en blanco, o escribir ~ – la abreviatura de su directorio personal – para completar.

Con scp, una barra al final del directorio de destino es opcional y no tiene ningún efecto. Una barra al final del directorio de origen es importante para otros comandos, como rsync.

Nota sobre rsync

A medida que adquiera experiencia en la transferencia de archivos, puede que el comando scp le resulte limitante. La utilidad rsync proporciona características avanzadas para la transferencia de archivos y es normalmente más rápida comparada con scp y sftp (ver más abajo). Es especialmente útil para transferir archivos grandes y/o numerosos y para sincronizar el contenido de carpetas entre ordenadores.

La sintaxis es similar a scp. Para transferir a otro ordenador con opciones de uso común:

BASH

[you@laptop:~]$ rsync -avP amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:

Las opciones son:

  • -a (archivo) para preservar las marcas de tiempo de los archivos, los permisos y las carpetas, entre otras cosas; implica recursión
  • -v (verbose) para obtener una salida detallada que le ayude a monitorizar la transferencia
  • -P (partial/progress) para preservar los archivos parcialmente transferidos en caso de interrupción y también muestra el progreso de la transferencia.

Para copiar recursivamente un directorio, podemos utilizar las mismas opciones:

BASH

[you@laptop:~]$ rsync -avP amdahl yourUsername@cluster.hpc-carpentry.org:~/

Tal y como está escrito, esto colocará el directorio local y su contenido bajo tu directorio personal en el sistema remoto. Si se añade una barra al final del origen, no se creará un nuevo directorio correspondiente al directorio transferido, y el contenido del directorio de origen se copiará directamente en el directorio de destino.

Para descargar un archivo, simplemente cambiamos el origen y el destino:

BASH

[you@laptop:~]$ rsync -avP yourUsername@cluster.hpc-carpentry.org:amdahl ./

Las transferencias de ficheros utilizando tanto scp como rsync utilizan SSH para encriptar los datos enviados a través de la red. Por lo tanto, si puede conectarse a través de SSH, podrá transferir archivos. Por defecto, SSH utiliza el puerto de red 22. Si se está utilizando un puerto SSH personalizado, tendrá que especificarlo utilizando la bandera apropiada, a menudo -p, -P, o --port. Comprueba --help o la página man si no estás seguro.

Cambiar el puerto Rsync

Supongamos que tenemos que conectarnos a rsync a través del puerto 768 en lugar del 22. ¿Cómo modificaríamos este comando?

BASH

[you@laptop:~]$ rsync amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:

Pista: consulte la página man o la “ayuda” para rsync.

BASH

[you@laptop:~]$ man rsync
[you@laptop:~]$ rsync --help | grep port
     --port=PORT             specify double-colon alternate port number
See http://rsync.samba.org/ for updates, bug reports, and answers
[you@laptop:~]$ rsync --port=768 amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:

(Tenga en cuenta que este comando fallará, ya que el puerto correcto en este caso es el predeterminado: 22.)

Transferencia interactiva de archivos con FileZilla


FileZilla es un cliente multiplataforma para descargar y subir archivos a y desde un ordenador remoto. Es absolutamente infalible y siempre funciona bastante bien. Utiliza el protocolo sftp. Puede leer más sobre el uso del protocolo sftp en la línea de comandos en la discusión de la lección.

Descargue e instale el cliente FileZilla desde https://filezilla-project.org. Tras instalar y abrir el programa, debería aparecer una ventana con un explorador de archivos de su sistema local en la parte izquierda de la pantalla. Cuando te conectes al cluster, los archivos de tu cluster aparecerán en la parte derecha.

Para conectarnos al cluster, sólo tendremos que introducir nuestras credenciales en la parte superior de la pantalla:

  • Host: sftp://cluster.hpc-carpentry.org
  • Usuario: Su nombre de usuario del cluster
  • Contraseña: Su contraseña del clúster
  • Puerto: (déjelo en blanco para usar el puerto por defecto)

Pulsa “Quickconnect” para conectarte. Deberías ver tus archivos remotos aparecer en la parte derecha de la pantalla. Puedes arrastrar y soltar archivos entre los lados izquierdo (local) y derecho (remoto) de la pantalla para transferir archivos.

Por último, si necesita mover archivos grandes (normalmente de más de un gigabyte) de un ordenador remoto a otro remoto, acceda mediante SSH al ordenador que aloja los archivos y utilice scp o rsync para transferirlos al otro. Esto será más eficiente que usar FileZilla (o aplicaciones relacionadas) que copiarían de la fuente a su máquina local, y luego a la máquina de destino.

Puntos Clave

  • wget y curl -O descarga un archivo de Internet.
  • scp y rsync transfieren archivos desde y hacia su ordenador.
  • Puede utilizar un cliente SFTP como FileZilla para transferir archivos a través de una GUI.