> Manuales > Manual de administración de servidores Linux

Guía del comando SCP, que permite transferir archivos a servidores usando SSH. Cómo subir o descargar archivos desde un ordenador local a un servidor remoto, mediante una transferencia segura.

Transferir archivos con SCP por SSH

Guía del comando SCP

Este es el índice de contenidos de esta guía del comando SCP:

Si ya sabes lo que es el comando SCP probablemente quieras ir directamente a ver algunos ejemplos rápidos de la sintaxis de comandos SCP.

Para qué sirve el comando SCP

Cuando gestionamos servidores habitualmente tenemos que transferir archivos desde nuestro ordenador al servidor remoto y al revés. Cuando comenzamos con servicios de alojamiento sencillos tenemos FTP para subir archivos al directorio donde se alojan las webs de ese servidor, pero esta situación no es la habitual cuando trabajas con servidores más complejos como servidores dedicados o servidores cloud. De hecho, lo normal es que este tipo de servidores no ofrezca un servicio de FTP. ¿Qué hacemos entonces?

La solución es usar el comando SCP que nos permite hacer transferencias de archivos entre servidores, o desde el ordenador local al servidor. Es bastante sencillo de usar y muy seguro ya que usa conexiones encriptadas.

Dependiendo de tu situación particular el comando a ejecutar puede ser diferente. Para los impacientes, este es el comando SCP que necesitaríamos para subir archivos al servidor.

scp fichero-a-subir.html usuario@www.example.com:ruta/destino/servidor/remoto

En este manual aprenderás a transferir archivos a un servidor al que solo te puedes conectar por ssh, por línea de comandos, una situación nada extraña. Ya sabes que SSH te permite conectarte al servidor y acceder al terminal para ejecutar cualquier comando de consola, pero esa conexión SSH no te permite traerte ningún archivo a tu ordenador, o depositar archivos en el servidor remoto. Para ello existe un comando diferente, totalmente independiente de ssh que te hace la labor, llamado scp.

Nota: Antes de nada aclarar que con FTP puedes transferir archivos con un cliente de FTP que te facilita mucho la vida. Por línea de comandos con scp la verdad es que es bastante más engorroso, pero a veces no hay otro remedio. Con FTP solo puedes descargar o enviar archivos en las carpetas habilitadas para ello. A veces los archivos los quieres poner en otra localización, o tienes que descargar archivos que no están en una ruta accesible por FTP. No habría problema, puesto que accediendo por SSH podrías copiar los archivos que deseas descargar en la ruta alcanzable mediante FTP. O si lo que necesitas es subir archivos, simplemente los subes donde FTP te lo permita y luego los mueves desde SSH hacia la carpeta donde realmente los necesitas. Esto es lo que suelo hacer yo en mi día a día, siempre que en el servidor se pueda hacer FTP. Este artículo te ofrece una vía alternativa para cuando no tienes FTP.

Cómo obtener el scp

El comando scp está disponible tanto en Linux como en Mac. Si estás usando Windows seguro que hay alguna forma también de usar ese comando. Yo ahora mismo la desconozco, pero sé que hay un software (no lo he probado nunca) que se llama WinSCP que te puede hacer esta tarea también, incluso con una interfaz gráfica.

El comando es muy sencillo de usar, simplemente indicamos el archivo origen, con su ruta y el archivo destino, con su ruta también. El tema es lidiar con la conexión con el servidor remoto, que nos hace que se complique un poco la sintaxis.

Internamente las conexiones de scp se realizan por un túnel SSH, por lo que, para referenciar el servidor remoto, usaremos los mismos datos de conexión que venimos usando para conectarnos por SSH.

Ejemplos de comandos SCP

Podemos ver mediante unos ejemplos cómo funciona este comando.

Nota: Según nos comentan entre los comentarios (gracias dolphinziyo) existe un programa en Windows llamado WinSCP, un cliente que emplea SSH para enviar archivos como si fuera por el tradicional FTP. Puede estar muy bien para quien esté trabajando en este sistema y no le guste operar por la línea de comandos.

Subir un archivo desde local al servidor remoto

Supón que tienes un archivo en tu máquina local y lo quieres transferir a un servidor remoto. Usas el comando con la siguiente sintaxis.

scp nombre_archivo usuario@servidor:ruta_servidor_donde_colocar_archivo

Recuerda que la conexión se realiza por ssh, imagina que tu servidor se llama "example.com" y el usuario con el que te conectas a la máquina es "root". Imagina que el archivo que intentas subir se llama "archivo_a_subir.zip" y que lo quieres dejar en la carpeta /var/www/example.com del servidor remoto.

scp archivo_a_subir.zip root@example.com:/var/www/example.com/

El nombre del server también podría ser perfectamente una dirección IP y por supuesto, el usuario no tiene por qué ser root.

scp otro_archivo_a_subir.js miusuario@112.223.4.215:/otra/carpeta/destino/

Subir una carpeta y todo su contenido de local a remoto con scp

El comando SCP también admite enviar una carpeta entera, con todo su contenido, de manera recursiva, para enviar cualquier cantidad de archivos al servidor. Para ello usamos la opción "-r", igual que se hace en otros comandos como de copiado o borrado.

scp -r csv-data root@2.1.3.0:/var/www/example.com/storage/

Mediante este comando se copiará en el servidor la carpeta "csv-data" con todo su contenido y se colocará en /var/www/example.com/storage/. Es decir, una vez realizada la transferencia, habrá una carpeta en el servidor en la ruta /var/www/example.com/storage/csv-data con todo el contenido de la carpeta en local con el mismo nombre.

Pero a veces no quieres subir una carpeta, sino todo el contenido que está dentro. Este comando permite subir por SCP todos los archivos de la carpeta en la que estamos posicionados en el terminal y colocarlos en una carpeta determinada del servidor.

scp * user@7.4.4.1:/home/forge/tomasalvarez.com/storage/app/public

Recuerda que si quisieras que fuese recursivo, para subir también todos los subdirectorios, tendrías que usar el flag -r

Este comando hace lo mismo, pero usando una llave ssh, gracias al flag -i (tienes más adelante otros ejemplos de comandos con llaves privadas).

scp -i /Users/midesweb/.ssh/socrates_cloud * forge@8.7.5.3:/home/forge/tomasalvarez.com/storage/app/public

Qué hacer cuando mi usuario no tiene permisos de escritura al usarlo en scp

Si no usas el usuario root en tu servidor, algo muy habitual porque muchos servidores tienen inhabilitado el usuario root, recuerda que no todas las rutas del sistema son elegibles para escribir datos en ellas, simplemente porque tu usuario no tenga permisos para escribir en esa carpeta. Como no puedes usar "sudo" directamente en el comando scp no puedes ganar permisos de superusuario.

En estos casos la operativa sería subir los archivos por SCP a la carpeta personal, usando un comando como este:

scp archivo-subir-scp.sh root@82.223.24.123:~/

Como has visto, colocando "~/" indicamos que la ruta de subida del archivo es la carpeta personal. No hace falta por tanto que conozcas la ruta física de esa carpeta.

A continuación te conectas por SSH con ese servidor y mueves los archivos con el comando "mv" a la localización donde sea necesaria, usando "sudo" si es que necesitas permisos de superusuario para escribir en esa carpeta.

Descargar un archivo desde un servidor remoto a nuestro ordenador local

Este segundo caso es casi idéntico, solo que intercambiamos el origen y el destino. Las explicaciones dadas hasta ahora son básicamente las mismas.

scp usuario@servidor:ruta_servidor_donde_esta_el_archivo ruta_ordenador_local_donde_poner_el_archivo

Con datos de conexión similares a los de antes, el comando nos saldría como este:

scp root@example.com:/var/www/example.com/archivo_a_descargar.html archivo_a_descargar_nombre_en_local.html

Usar SCP para traerse toda una carpeta del servidor remoto

Hay algunas opciones útiles para trabajar con el comando scp, puedes acceder a la ayuda con el comando “man scp”. Comparto contigo una opción que uso bastante para realizar la copia de todos los archivos de una carpeta, de manera recursiva, copiando también el contenido de las subcarpetas. La opción es -r.

scp -r root@161.0.0.1:/var/www/desarrolloweb.com/carpeta/ ruta_destino_en_local/

Esto te copiará todos los archivos que en el servidor remoto encuentras en la ruta “/var/www/desarrolloweb.com/carpeta/“ (incluso con las carpetas que puedas encontrar en esa ruta). Los descargará y se colocarán en tu ordenador local en la carpeta “ruta_destino_en_local”.

Usar el comando SCP contra un servidor con llave privada

Muchos servidores requieren llave privada para iniciar sesión por SSH. Si esto es así en tu caso, necesitarás la misma llave privada para el comando SCP.

El parámetro para indicar la llave privada es "-i", [-i identity_file]. Sigue con un espacio y la ruta donde tengas la llave en tu ordenador local. Te lo mostramos con un ejemplo de comando.

scp -i /Users/midesweb/.ssh/archivo_llave archivo_local.txt user@0.0.0.3:/var/www/example.com/archivo_en_remoto.xml

Este comando permitiría hacer un upload por SCP, de un archivo llamado archivo_local.txt, a un servidor con ip 0.0.0.3, accediendo con el usuario "user" y la clave privada que tenemos en el documento con ruta completa /Users/midesweb/.ssh/archivo_llave. Como puedes ver, todo lo que has aprendido de SCP en este artículo aplica exactamente igual. Simplemente tienes que usar la opción -i para indicar la ruta donde tienes la clave privada de acceso ssh que pretendes usar para la transferencia SCP.

scp -i /Users/midesweb/.ssh/llave_ssh user@1.2.3.4:/var/www/example.com/public/download.comprimido.tgz .

Este segundo comando SCP que hace uso de una llave ssh, permitiría la transferencia del archivo desde remoto a local, es decir, la descarga de un archivo. El archivo se llama download.comprimido.tgz y se guardaría en el ordenador local con el mismo nombre.

Si necesitases obtener todo el contenido de una carpeta recursivamente, con todos sus subdirectorios, accediendo al servidor con la llave ssh lanzarías el comando siguiente:

scp -i /Users/mi_user/.ssh/mi_llave -r user@1.6.2.21:carpeta/otra_carpeta_a_descargar .

Esto te obtenedría todo lo que hay en la carpeta del servidor que está dentro del usuario user y carpeta/otra_carpeta_a_descargar y la pondría en el directorio donde estuviéses posicionado en el terminal.

Para hacer la transferencia en la dirección contraria de toda la carpeta que tienes en local y enviarla al servidor, lanzarías este comando.

scp -i /Users/mi_user/.ssh/mi_llave -r . server_user@1.2.2.1:carpeta/destino

Conclusión comando scp

Espero que con estas notas puedas usar sin problemas tu línea de comandos para transferir archivos al servidor de forma segura, por scp, usando un túnel SSH, algo que seguramente tendrás que incorporar tarde o temprano en tus flujos de trabajo para desarrollo en la web. Recuerda que tienes muchos otros artículos dedicados al trabajo con servidores en el Manual de administración de servidores web.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual