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.
Guía del comando SCP
Este es el índice de contenidos de esta guía del comando SCP:
- Introducción al comando SCP
- Dónde obtener SCP
- Ejemplos de comandos SCP
- Usar el comando SCP con llaves ssh
- Conclusión
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.
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.
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”.
Ejemplo de conexión usando la configuración de .ssh/config
Hay veces que tenemos configurados los accesos ssh en el archivo .ssh/config. En estos casos los comandos de SCP se simplifican todavía más, porque no necesitamos indicar los datos de acceso a ssh, sino que los toma directamente del archivo de configuración.
Si no conoces el archivo de config de .ssh te recomendamos leer el artículo Archivo config para configuración ágil de accesos SSH.
En este ejemplo vamos a ver un comando de conexión por SCP para la descarga de un archivo del servidor. Como verás, solamente necesitamos indicarle el nombre de una configuración ya predefinida en el archivo config:
scp nombre_configuracion:~/example.com/storage/app/example/2024-05-04-20-17-38.zip /ruta/local/destino
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...