29 de abril de 2016

Copiando archivos a un servidor remoto

Como copiar archivos a un servidor remoto rápidamente usando SCP, RSYNC y FTP, cualquiera sea el sistema operativo de nuestra máquina local.

Aunque lo tradicional es usar un cliente (gráfico) FTP, acá lo haremos de un módo mucho más rápido usando solamente la terminal.

Hay muchas maneras de copiar archivos a un servidor remoto, entre ellas usar un servidor de control de versiones como Git. Aunque, en la generalidad de los casos, usar Git no es lo recomendado cuando trabajamos con un servidor remoto en producción.

En este artículo veremos como transferir o copiar archivos a un servidor remoto utilizando la consola, mediante los comandos:

  • SCP
  • RSYNC
  • FTP

Copiar archivos a un servidor remoto usando SCP

El comando SCP es muy flexible, incluso permite la copia entre dos (2) servidores remotos.

El comando SCP (copia segura), se apoya en SSH (Telnet Seguro), es decir, necesitamos una cuenta válida SSH en el servidor remoto para efectuar la operación.

Para copiar archivos usando SCP, debemos abrir una terminal que soporte SSH, en el caso de windows podemos usar PuTTY o Cygwin, y usar alternativamente los siguientes comandos:

Para copiar un archivo, por ejemplo readme.md en nuestro directorio local actual, a la carpeta de usuario en el servidor remoto:

scp readme.md username@IP_SERVER:~/

Copiar varios archivos usando wildcards, en este caso todos los archivos PHP desde nuestro directorio local, a la carpeta /var/www en el servidor remoto:

scp *.php username@IP_SERVER:/var/www/

O copiar directorios completos, por ejemplo:

scp -r /home/ivan/ username@IP_SERVER:~/

También el comando SCP, provee facilidades para manejar un menor tiempo de transferencia en el proceso de copiado usando compresión, por ejemplo:

scp -C *.php username@IP_SERVER:/var/www/

Podemos hacer que SCP nos muestre más información del proceso, usando la opción v, por ejemplo si deseamos más información al transferir archivos usando compresión: scp -Cv *.php username@IP_SERVER:/var/www/

Incluso existe la alternativa de limitar el ancho de banda (expresando en Kbits/seg) en la transferencia:

scp -l 25 *.php username@IP_SERVER:/var/www/

Más usos los podemos encontrar en el artículo: Transferir archivos entre computadoras, Importar Bases de Datos MySQL.

Copiar archivos a un servidor remoto usando RSync

RSync permite acelerar mucho la transferencia de archivos, pues transfiere sobre la red sólo las diferencias entre los dos conjuntos de archivos (archivos locales vs remotos) que se desean sincronizar.

El comando RSync es empleado para hacer copias de seguridad en sistemas operativos tipo UNIX (Linux, Mac OS X), pues es más eficiente que el comando para copiar original. Especialmente, cuando se necesita ahorrar ancho de banda, usar RSync en la transferencia de archivos a un servidor remoto es la opción a adecuada.

La sintáxis de RSync la podemos describir como una sincronización entre archivos de origen con archivos de destino, si no hay archivos de destino, entonces el proceso copiará todos los archivos de origen en el directorio de destino:

rsync <archivos_de_origen> <archivos_de_destino>

El comando RSyn para su ejecución no requiere de privilegios (permisos) especiales, se puede utilizar tanto para hacer copias locales como remotas.

La forma de uso de RSync, por ejemplo para copiar desde la ubicación local, la carpeta ‘mi_proyecto’ a un directorio ‘var/www/’ en un servidor remoto será:

rsync /home/ivan/proyectos/mi_proyecto user@ip_server:/var/www/

Si deseamos incluir solamente los archivos PHP:

rsync /home/ivan/proyectos/mi_proyecto/*.php user@ip_server:/var/www/mi_proyecto

Ahora si deseamos incluir todos los subdirectorios, usamos el mismo comando pero con la opción ‘r’, que significa recursiva donde se copiarán además todos los subdirectorios de la ruta determinada:

rsync -r /home/ivan/proyectos/mi_proyecto user@ip_server:/var/www/

Opciones de uso frecuente en RSync:

  • ‘a’: transfiere en ‘modo archivo’, incluyendo enlaces simbólicos y preservando sus atributos: permisos, propietarios, etc.
  • ‘z’: Establece que una compresión será utilizada en la transferencia y así disminuir el tiempo de la misma.
  • ‘v’: Indica ‘Verbose’, es decir en el prompt se desplegarán los detalles del proceso en ejecución.
  • ‘u’: Salta el copiado de los archivos de origen que son más antiguos que los archivos de destino.

Entonces podemos usar RSync con todas las opciones anteriores usando la sintáxis:

rsync -avzu app/public/ user@ip_sever:~/public/

Nota: Cuando sincronizamos directorios, si agregamos al final de la carpeta origen el caracter ‘/’. sólo se sincronizarán los contenidos de la carpeta sin crearla nuevamente. Será equivalente escribir: rsync app/public user@ip_server:~/ a rsync app/public/ user@ip_server:~/public

Copiar archivos usando FTP desde la terminal

Desde Windows para realizar transferencias FTP no se requiere de ningún software adicional, sólo la terminal propia del sistema y digitar las mismas instrucciones señaladas en este apartado.

En la ejecución de transferencia de archivos por FTP, es requisito que el servicio FTP esté activo en el servidor remoto.
Aunque, tradicionalmente el uso del protocolo de transferencia de archivos FTP es operado desde un cliente con interfaz gráfica de usuario (GUI), especialmente porque nos permite conocer la estructura de directorio del servidor remoto. Sin embargo, usar FTP desde la línea de comandos es una opción bastante simple y directa de transferir archivos.

También es usado hoy en día, el protocolo sftp en sustitución al ftp, en cualquier caso la sintáxis es igual.

En el uso de este comando, es requisito previo establecer una sesión FTP con el servidor remoto usando la instrucción:

ftp ip_server

O también, emplear una sintaxis alternativa para ingresar el nombre de usuario inmediatamente:

ftp -u username ip_server

Nota: en cualquiera de los comandos mencionados en este artículo se puede intercambiar la IP del servidor remoto o su Nombre de Dominio, cuando lo posea.

Luego, deberemos ingresar la password para esa cuenta FTP y así iniciar la sesión con el servidor, esto desplegará en la terminal el prompt ftp>.
Acá es requisito conocer si vamos a transferir archivos binarios binary o en modo texto ascii , para así indicárselo al sistema previamente. Por ejemplo, para transferir archivos PHP que son archivos de texto, es necesario primero establecer el modo ascii:

ftp> ascii

Notar: que ‘ftp>’ no es parte del comando, sino el prompt de la sesión FTP.

Ahora para copiar desde la máquina local a la remota, primero debemos conocer en que lugar de la máquina remota estamos posicionados mediante el comando pwd. Usamos los comandos ls y cd para listar el contenido del directorio actual y navegar entre directorios respectivamente:

ftp> ls

Para copiar multiples archivos a la carpeta ‘public_html’ del servidor remoto usamos el comando ‘mput’:

ftp> cd public_html
ftp> mput *.php

Si sólo deseamos copiar un archivo individual:

ftp> put index.php

En proceso inverso, es decir, copiar desde la carpeta remota ‘public_html’ a la carpeta local actual:

ftp> mget *.php

Si es sólo un archivo a transferir a la carpeta local, entonces:

ftp> get index.php

Finalmente, para salir de la sesión FTP se recurre al comando:

quit

Naturalmente, hay otras opciones interesantes y alternativas que también usan el protocolo FTP, junto con un set de comandos más fáciles de utilizar, por ejemplo: lFTP. Pero necesitamos que estén instalados en el servidor, donde muchas veces no tenemos las autorizaciones requeridas para efectuarlo.

Conclusión

Aprender los comandos anteriores es simple, es sólo recordar una nemotécnica, porque SCP es muy similar al comando copiar CP, y su sintáxis es:

cp <ORIGEN> <DESTINO>

En el caso de SCP sólo en el destino hay que incorporar un identificador, que valga la redundancia identifique al equipo destinatario, en este caso:

scp <ORIGEN> <id_destino>:</DESTINO>

Donde <id_destino> es igual a: user@ip_server, así quedaría como:

scp <ORIGEN> user@ip_server:</DESTINO>

En el caso de RSYNC es similar, pera hay que recordar las opciones:

rsync -zvu <ORIGEN> user@ip_server:</DESTINO>

Por último, es conveniente conocer la forma de trabajar con FTP ya que es ampliamente disponible.

Enlaces de interés