Para copiar archivos entre servidores linux es muy útil usar el comando SCP. Ahorra tiempo, ya que no necesitamos tener que descargarlos previamente para poder subirlos al servidor destino. La transferencia de archivos se hace directamente.
Tabla de contenidos
Comando SCP para copiar ficheros entre servidores
El comando SCP es la versión segura del comando CP. De ahí que se llame Secure CoPy. Es una extensión del comando SSH y permite que se puedan copiar archivos entre distintos servidores o máquinas de forma segura, pidiendo autenticación previa.
El formato del comando es el siguiente:
scp [servidor origen]:[archivo] [servidor destino]:[archivo]
Donde [archivo] puede ser un archivo como tal o una ruta de un archivo, o una ruta de una carpeta:
- Ejemplo de ruta de archivo: /home/usuario/archivo.txt
- Ejemplo de ruta de carpeta: /home/usuario/carpeta
- Ejemplo de archivo: archivo.txt
La última opción es cuando estamos sobre la carpeta en la que se encuentra el archivo, como es obvio.
Después del usuario@servidor hay que usar el signo de los dos puntos : para indicar a continuación el archivo o ruta de lo que se quiere copiar.
Copiar de mi servidor a otro
Viendo los ejemplos anteriores, el caso de querer copiar un archivo desde mi máquina a otra, tendremos que hacer lo siguiente:
scp archivo.txt usuario@dominio.com:/home/usuario/
En este caso, hemos puesto como servidor destino el usuario y el dominio, pero podemos usar también como alternativa:
- Con la ip de la máquina: usuario@192.168.1.15
- Con el nombre de la máquina: usuario@srvpruebas
Cuando pulsemos el intro nos pedirá la contraseña del usuario de la máquina destino para que nos permita realizar la copia.
Copiar de otro servidor al mío
Esto sería al contrario, copiar desde un servidor al nuestro.
scp usuario@dominio.com:/home/usuario/ .
En este caso he puesto el punto para indicar que lo copie en la carpeta que me encuentro. Pero podría haber puesto también por ejemplo /home/usuario/carpeta para que lo copiara en esa ruta.
Copiar entre dos servidores
Si queremos realizar la copia entre servidores en los que no estamos logados, es decir, servidores ajenos al que estamos conectados, tenemos que hacer lo siguiente:
scp usuario_uno@servidor1:/home/usuario_uno/archivo.txt usuario_dos@servidor2:/home/usuario_dos/
Aquí nos pedirá las credenciales de ambos usuarios para poder realizar la copia.
Copia recursiva con el comando SCP
Si queremos copiar una carpeta con todos sus archivos, tenemos que usar el parámetro -r.
scp -r /carpeta usuario@servidor:/home/usuario/carpeta-destino
Esto yo no lo recomiendo, sobre todo si la carpeta contiene cientos de archivos y muy pequeños. La copia puede tardar demasiado. Para estos casos es recomendable comprimirla primero, copiar el archivo comprimido, y descomprimir el servidor destino. Ahorrarás mucho tiempo.
Para comprimir arhivos en linux te recomiendo el tutorial: comprimir y descomprimir archivos en linux
Comando SCP con puerto
Si necesitas especificar el puerto del host remoto debes usar el parámetro:
-P [puerto]
donde -P debe ser en mayúsculas. Ejemplo:
scp -P 80 archivo.txt usuario@dominio.com:/home/usuario/
Hola gracias por tu blog.
Tengo la siguiente pregunta.
Hay manera de copiar las carpetas con sus subcarpetas y adicional dejar un log de las rutar de destino de todas las carpeta con sus subcarpeta y archivos.
Gracias
Buenas. Para copiar carpetas con subcarpetas, tienes que añadir el parámetro -R. Para sacar el listado, pues creo que con un find y asterisco, y te saca todo por pantalla. No sé si te podrá valer. Un saludo, Javier.
haces la sentencia de scp y le agregas al final > archivo.txt y ahi te exporta todo.
Buenas, tengo la siguiente duda. Como se podría hacer en powershell para realizar una copia de un fichero desde un servidor linux a un windows 10. Ya que al intentar hacer el script, me sale que la ruta obtenida desde el copy-item no es correcta, pero sin embargo si hago un scp desde CMD, se realiza correctamente la copia del fichero.
Un saludo
Hola Ivan. Para copiar de linux a windows, nosotros lo hemos hecho en un sistema de la siguiente manera. En Windows tienes que habilitar el compartir la carpeta, para que sea visible. Después, en la máquina linux, creas un enlace simbólico a esa unidad compartida otorgándole todos los permisos necesarios:
sudo mount -t cifs -v //ipWindows/carpetaCompartidaWindows /mnt/carpeta -o username=usuarioWindows,domain=dominio,uid=usuario,gid=nombreGrupo,forceuid,forcegid,file_mode=0777,dir_mode=0777
Una vez que ya la tengas montada en linux, puedes hacer un copy normal desde /opt por ejemplo a /mnt/carpeta. Y eso lo copia directamente en la máquina de Windows.
Espero que te sirva. Un saludo.
Buenas tardes mi duda es la siguiente:
¿Como especifico el puerto en el ddns? Y es es que en el mismo ddns tengo 2 servidores solo que uno está abierto en el puerto 22 y otro en el 23.
Buenos días Tomás. Te he añadido un ejemplo en el tutorial. Un saludo.
Hola, gracias por la info. Debo copiar una carpeta desde mi computador local a un servidor, sin embargo, dentro del servidor, debo iniciar sesión nuevamente con ssh (debo logearme dos veces). ¿Cómo puedo copiar los archivos? Gracias 😀
Hola Carlos, para subir archivos al servidor es preferible usar un cliente de FTP como WinSCP. Es más sencillo así. Un saludo.
Buen día, para copiar desde un ftp hacia una ruta local de mi servidor centos linux como le haría
No te sé decir porque no lo he probado. Si solo quieres copiar 1 archivo, usa wget y le das la url del archivo. Un saludo.
Hola buenas,
Si existen dos servidores externos con puertos distintos y tenemos acceso a través de ssh como sería.
Ejemplo
servidor 192.168.1.199 puerto 21
192.168.1.141 puerto 25
He probado lo siguiente pero no encuentra los puertos (va al 22)
sudo scp d@192.168.1.189:21/etc/libvirt/qemu/magento.xml e@192.168.1.141:25/etc/libvirt/qemu
Prueba con:
sudo scp -P 25 d@192.168.1.189/etc/libvirt/qemu/magento.xml e@192.168.1.141/etc/libvirt/qemu
hola, tengo una duda, como quedaria el comando si tengo un archivo txt y quiero dejarlo dentro de un .zip, porque es pesado y no quisiera que tomara mucho espacio
Creo que hay que combinarlo con una tubería y el comando tar para generar el tar.gz.
Hola
En la carpeta data4 tengo los archivos
test1.txt
test2.txt
test3.txt
Con un solo archivo si lo puedo hacer, pero al seleccionar varios no funciona
He intentado separando por coma y también dejando un espacio pero no funciona:
Quisiera enviar varios archivos algo así:
scp db2inst1@10.20.30.40:/db2/data4/test1.docx,test1.docx,test1.docx ~/Users/demo/Desktop/Datos/
Lo estoy haciendo desde una terminal de MacBook
Desde ya mil gracias
Saludos
En vez de indicar todos los archivos, usa el asterisco poniendo *.docx
Hola Buen dia
Me podrian ayudar es que voy a enviar una carpeta desde un terminal y al momento de enviarlo me sale el siguiente mensaje
root@52.116.193.118: Permission denied (publickey).
scp: Connection closed
lo estoy haciendo desde terminal de MacBook
gracias
No sé decirte. No tengo Mac. Parece un error de seguridad.
Hola buenos dias como podria copiar archivos usando scp entre un servidor unix y un servidor linux sin que pida contraseña, he creado una keygen (ya habia una creada) pero igual sigue pidiendo la contraseña, alguna sugerencia lo agradeceria
No controlo mucho esa parte, pero sé que hace de esta forma. Mira este tutorial sobre cómo realizar una conexión SSH sin contraseña. Un saludo.
Buenas Tardes, tengo una pregunta puedo copiar un archivo log de un servidor que esta en una ruta que esta en ubuntu a mi equipo personal en windows
Yo utilizo WinSCP, que mediante SFTP te puedes descargar los archivos a tu pc.