Sincronizar y copiar carpetas con robocopy

El otro día hablábamos sobre sincronizar carpetas con rsync y hoy vamos a ver cómo  hacer lo mismo con robocopy. Se trata de un programa similar a rsync pero para Windows.

Para copiar archivos entre dos ubicaciones ejecutamos robocopy con el parámetro /E para realizar la copia recursiva:

robocopy C:\carpeta_origen C:\carpeta_destino /E

Si lo que queremos es que las carpetas se sincronicen y se borren los archivos que se eliminaron también en el origen entonces el parámetro sería /MIR (de mirror):

robocopy C:\carpeta_origen C:\carpeta_destino /MIR

#otra opción sería
robocopy C:\carpeta_origen C:\carpeta_destino /E /PURGE

Y para copiar los archivos con todos sus metadatos:

robocopy C:\carpeta_origen C:\carpeta_destino /E /COPYALL

Incluso tenemos la opción de que se borren los archivos del origen cuando se termine la copia:

robocopy C:\carpeta_origen C:\carpeta_destino /E /move

Hay un gran número de parámetros a utilizar, así que os dejo también un enlace a la web de Microsoft donde están recogidos y explicados todos.

Sincronizando carpetas y copiando archivos con rsync

Hasta la aparición de robocopy la herramienta rsync fue una de las más envidiadas por los administradores de sistemas Windows cada vez que se comparaban con Linux. La principal función de rsync es copiar archivos entre dos ubicaciones, y puede ser tanto entre dos ubicaciones locales como entre una local y una remota (o viceversa). Dos de los puntos fuertes de rsync es que nos permite utilizar SSH para las conexiones remotas, reforzando así la seguridad,y está pensado para ahorrar ancho de banda y tiempo cuando se realicen actualizaciones dedicándose simplemente a copiar los datos que han cambiado.

Para una operación de copia entre dos carpetas locales la sintaxis sería:

#usaremos los parámetros:
#r para que haga copia recursiva
#t para que guarde la fecha
#v para que muestre el progreso
rsync -rtv carpeta_origen/ carpeta_destino/

Ojo con la barra del final, que para rsync carpeta_destino y carpeta_destino/ no son lo mismo. Por ejemplo

rsync -rtv carpeta_origen/ carpeta_destino/
#esta copiará tal cual los contenidos de origen en destino
rsync -rtv carpeta_origen carpeta_destino/
#esta creará una carpeta nueva, llamada carpeta_origen,
#dentro de la carpeta_destino.

Como ya comentaba arriba, podemos hacer que rsync sólo copie los archivos que han sido modificados, con la idea de ganar tiempo (y no consumir ancho de banda en caso de copia remota). Tenemos dos formas de hacerlo:

#comparando fechas de edición
#añadimos el parámetro u
rsync -rtvu carpeta_origen/ carpeta_destino/

#haciendo un checksum de ambos archivos
#para ver si son distintos
#en eso caso quitamos t y añadimos c
rsync -rvuc carpeta_origen/ carpeta_destino/

Esto está bien pero ¿qué pasa si hemos quitado archivos en un lado y queremos que se quiten en el otro? ¿si queremos sincronización total? Pues tenemos el parámetro –delete, con varias variantes:

#Borrando antes de copiar los archivos
rsync -rtvu --delete-before carpeta_origen/ carpeta_destino/

#Borrando después de copiar los archivos
rsync -rtvu --delete-after carpeta_origen/ carpeta_destino/

#Borrando durante la copia
rsync -rtvu --delete-during carpeta_origen/ carpeta_destino/

#Encuentra durante la copia los archivos faltantes,
#pero los borra al terminar
rsync -rtvu --delete-delay carpeta_origen/ carpeta_destino/

Según el tipo de copia que se este haciendo y las necesidades del momento puede ser más interesante usar una u otra.

Existen más parámetros que pasar. Por ejemplo –exclude nos permite definir un patrón de exclusión para la copia, o –exclude-from, que nos permite hacerlo pero cargando los datos desde un archivo. Con –max-size se excluyen todos los archivos que superen un tamaño, y con –min-size todos los que no alcancen uno concreto. El parámetro -z nos permite definir que los archivos sean comprimidos antes de su envío, dependiendo de la red y la potencia de los equipos puede ser recomendable o no. Es interesante también el parámetro -a, que copia toda la información de los archivos: enlaces simbólicos, propietarios, grupos, permisos…

Hasta aquí hemos hablado de las posibilidades de rsync en copias locales. Pero ¿cómo conectamos con un equipo remoto? La sintaxis sería rsync -parámetros carpeta_origen/ usuario@dominio:/ruta/destino/

#pc local a remoto
rsync -rcvu /tmp/ admin@tlm.usc.es:/home/Departamentos/

#pc remoto a local
rsync -rcvu admin@tlm.usc.es:/home/Departamentos/ /home/donnierock/

Si sois de esos más vagos que el peluquero de Billy Corgan tenéis la opción de instalar grsync para poder disponer de un entorno gráfico desde el que trabajar.

grsync

Si tenéis interés puede que hable más sobre rsync y también comente algo de robocopy.

Hacer sonar un dispositivo Android perdido

¿Has perdido tu móvil Android por la casa? De toda la vida cuando no lo encontramos nos llamamos desde el fijo para hacerlo sonar. Pero ¿y si estás en vibración o en silencio? Entonces la cosa se complica… o no.

Si tienes el teléfono vinculado a una cuenta de Google, que suele ser lo habitual para la mayoría de usuarios, basta con entrar al administrador de dispositivos logueándose con dicha cuenta y allí aparece la opción Hacer Sonar.

El administrador también permite localizar el teléfono geográficamente con bastante precisión (lo he probado y me sitúa a 50 metros de mi posición real) y hasta bloquearlo y borrar los datos, en caso de robo o pérdida irreparable.

Una serie de opciones interesantes en caso de pérdida… y que también agudizarán tu paranoia por lo fácil que sería localizarte con teléfono encima para alguien con acceso a tu cuenta.

Configurando GIMP para hacer Pixel Art

GIMP es uno de los editores de imagen más populares de software libre. Si estás buscando un software con el que trabajar tus diseños de pixel art es una opción recomendable. Pero claro, hay que configurar un poco.

Lo primero es irte al menú Editar y allí a Preferencias. En Opciones de Herramienta seleccionamos que no se aplique ninguna interpolación. En ese mismo menú nos vamos a Rejilla Predeterminada y ponemos que sea de 1px por 1px. Esto nos facilitará las cosas a la hora de dibujar. Tras eso creamos una nueva imagen, con una resolución de 72 píxeles por pulgada. Para una primera prueba mejor no hagamos un lienzo muy grande.

GIMP para Pixelart

Para mostrar la rejilla que configuramos antes le damos al menú Ver y allí seleccionamos Mostrar Rejilla.

Es importante que el pincel nos pinte lo más plano posible. Para eso elegimos la herramienta Lápiz, ya que con la brocha quedará difuminado. Como decía, elegimos la herramienta Lápiz con opacidad 100% y pincel de 1px de grosor. Con la Goma de Borrar hacemos lo mismo: 1 px de grosor y marcamos la opción Bordes Duros.

configurando lápiz para pixelart

El tener marcada la interpolación como ninguna os permitirá, al terminar, redimensionar la imagen  de forma que mantenga los píxeles. Ahora ya sólo os queda trastear para hacer vuestros macacos 8 bits.

Aquí os dejo un ejemplo de qué se puede hacer en dos minutos, homenajeando a Michael Schenker (chiste sólo para metaleros).

Monigote palo pixelart

Y aquí podéis ver lo que puede hacer un artista con talento del bueno.

Vegeto en pixelart

Cifrar una memoria USB en Ubuntu

Tras una serie de artículos dedicados a otros temas volvemos con algunas de mis cuestiones favoritas: software libre, cifrado/encriptación y seguridad informática. Aunque algunos gobiernos nos quieran hacer creer que esto es sólo para quien tiene algo que ocultar, la privacidad es un derecho y el cifrado una herramienta necesaria para ello. ¿A alguien le parecería lógico pedir una ley  nos obligara a vivir en casas de paredes transparentes? ¿que quitáramos las persianas de nuestras ventanas y las cerraduras de nuestras puertas por si ocultamos algo tras ellas? El cifrado es la pared de tus datos, es la persiana, es la puerta.

En mis tiempos de subsistencia freelance llevaba muchas veces el proyecto de un cliente en un pendrive. ¿Qué pasaría si lo pierdo? La propia Ley Orgánica de Protección de Datos nos solicita almacenar la información sensible de una persona de forma segura. Si la tengo que llevar en una unidad extraíble entonces esta necesariamente debe estar cifrada.

Lo primero para nuestro caso es instalar el paquete cryptsetup si todavía no lo tenemos disponible en nuestra distro:

sudo apt-get install cryptsetup

Una vez instalado, y con el pendrive conectado al equipo, abrimos el administrador de discos de Ubuntu.

Administrador de discos de Ubuntu

Bajo la tabla de particiones del dispositivo verás un botón cuadrado parecido a un botón de stop (en la captura que he puesto a continuación es un botón de play porque ya lo había pulsado) que nos dará la opción de desmontar el volumen.

Particionando unidad usb

Una vez desmontado el volumen pulsas el botón con dos engranajes que está a la derecha del de desmontar y eliges la opción de Formatear. En el menú desplegable de la ventana flotante que se abrirá eliges Cifrado, compatible con sistemas Linux (LUKS + Ext4) en el menú desplegable con todos los formatos. Como puedes observar este método nos permite cifrar una partición, de forma que si no quieres no tienes por qué cifrar todo el pen, puedes hacerlo sobre una parte y dejar otra con menos seguridad para llevar algo intrascendente y tener un acceso más rápido. Seguidamente añades un nombre para el volumen que vas a formatear y una contraseña.

Finalizando el formateo de unidad cifrada

Si en el futuro quieres deshacerte de la partición formateada tendrás que volver a formatear el dispositivo, pero en cambio si quieres cambiar la contraseña el administrador de discos te dará esa opción.

Cuando insertes un volumen así cifrado en un equipo con Ubuntu te dará varias opciones: pedir siempre la contraseña, recordarla mientras dure la sesión o recordarla siempre. Esta última puede ser muy cómoda, pero piensa que en según qué casos puede que no te interese que los datos estén accesibles siempre que el pen se conecte a ese equipo.

Código PHP para comprobar si un servidor está funcionando o caído.

Estaba los día pasados liado con un desarrollo en PHP para uso interno en la oficina que requería que, en un punto dado, el código recogiera qué servidores de los clientes están activos y cuales no.

Tras sucesivas búsquedas y documentación llegué a dos soluciones. Esta primera lo que haría sería mostrarnos si en una máquina está funcionando el servidor web:

/*La función recibe la ip
o la url del servidor*/
function testServidorWeb($servidor) {
    $a = @get_headers($servidor);
    
    if (is_array($a)) {
        return true;
    } else {
        return false;
    }
}

En este primer ejemplo creamos una función que recibe o la ip externa o la url del servidor que queremos comprobar que tiene su servidor web funcional. Dicha función hará una petición HTTP al servidor y recogerá las cabeceras de la respuesta con get_headers. En caso de que haya recibido la respuesta la función devuelve true, y si no ha habido respuesta alguna entonces devuelve false.

En el segundo ejemplo tenemos una función que comprueba si se recibe respuesta desde un puerto concreto. Así podemos comprobar varios servicios como el servidor web, el servidor ftp, la conexión por telnet…

function checkPuerto($dominio,$puerto){
    $starttime = microtime(true);
    $file      = @fsockopen ($dominio, $puerto, $errno, $errstr, 10);
    $stoptime  = microtime(true);
    $status    = 0;
 
    if (!$file){    
        $status = -1;  // Sitio caído
    } else {
        fclose($file);
        $status = ($stoptime - $starttime) * 1000;
        $status = floor($status);
    }
    
    if ($status <> -1) {
        return true;
    } else {
        return false;
    }
    
}

En este caso le enviamos a la función el dominio del servidor a probar y el puerto que queremos chequear, sirviéndonos de la función fsockopen de PHP. Ojo si queréis comprobar los sockets UDP, que podéis recibir un falso positivo debido a que UDP es un protoclo «sin conexión» (en el enlace a fsockopen ya hay un aviso donde lo explican).

FTP en línea de comandos

El otro día me encontraba instalando un servidor con varias instancias virtualizadas de Windows 2k12, que por cuestiones de rendimiento iban sin entorno gráfico (el llamado modo Server Core). Necesitaba descargar una serie de archivos desde un servidor FTP, así que tuve que recurrir a la línea de comandos… y eso me recordó que nunca habíamos tocado aquí el tema.

Para conectar el ftp basta con teclear en la consola ftp seguido de la dirección del servidor al que nos queremos conectar. Por ejemplo:

ftp servidordeprueba.com

Tras eso nos debería pedir usuario y contraseña (o no, eso depende de la configuración del servidor, pero lo normal es que sí). Una vez conectados disponemos de los siguientes comandos para trabajar:

  • ls o dir: Dependiendo de si estamos en un entorno Unix o Windows. Nos listará los archivos existentes en el directorio.
  • cd: Tanto en Unix como en Windows es el comando que se utiliza para navegar entre carpetas.
  • pwd: Si de tanto usar el cd te pierdes y nor recuerdas en qué directorio estás, este comando te lo dirá.
  • status: Nos informa del estado de nuestra conexión con el servidor.
  • open: Si se cierra tu conexión ftp, si quieres cambiar de servidor o si al ejecutar el comando ftp no has puesto a qué servidor te conectas, este comando va seguido de la dirección del servidor con el que queremos conectar.
  • binary: Aplicando este comando definimos que los datos que se descargarán vendrán serán un archivo binario (ejecutables, imágenes, vídeos, audio). Hay otro modo, del que hablaremos a continuación, para archivos de texto. No es recomendable descargar archivos binarios en modo texto, ya que probablemente se corrompan.
  • ascii: Al igual que binary define el tipo de archivo que descargaremos. Se recomienda para archivos txt,htm, html, css,asp, vbs, js, xml, php… en fin, todo lo que sea texto plano.
  • get: Es el comando utilizado para descargar desde el servidor. La sintaxis es get nombreDeArchivo rutaDondeLoGuardaremos. Si no ponemos ruta de destino lo descargará en el directorio en el que estamos. Existe la variable mget que nos permite descargar múltiples archivos, o reget para reiniciar una descarga cortada.
  • put: Lo contrario que el anterior, la sintaxis es similar, pero en este caso en lugar de descargar desde el servidor subimos archivos al mismo.
  • rename: Nos permite renombrar un fichero del servidor.
  • delete: El nombre es bastante intuitivo, ya que sirve para borrar ficheros del servidor. No funciona con carpetas. Mucho cuidado al usarlo, no vaya a ser que borres lo que no debieras.
  • mdelete: Como delete, pero con la diferencia es que borra varios archivos en lugar de uno. Basta con ponerlos todos, separados por espacios.
  • rm: Si lo que quieres es borrar una carpeta, este es tu comando. Sólo funciona con carpetas vacías, así que tendrás que borrar antes los ficheros que contiene.
  • chmod:Un viejo conocido para los usuarios de UNIX. El comando chmod nos permite modificar los permisos de lectura y escritura de un archivo o carpeta.
  • Finalmente bye y quit nos permiten salir del ftp para volver a la consola de comandos.

Y en caso de usar un sistema linux el comando ! nos permitirá ejecutar comandos en nuestra shell sin salir del ftp. Basta con usar ! seguido de un comando.

Existen más comandos y opciones, pero estos son los más usados y básicos. Puedes ver información sobre el resto usando el comando HELP

Instalando Guest Additions de VirtualBox en Lubuntu 15.10

Primer contacto con una versión 15.10 de Ubuntu: esta mañana he tenido que montar una máquina vitual en el curro para un experimento. Por temas de ligereza ha sido un Lubuntu, la versión con el ligero escritorio LXDE, concretamente la vesión de 32 bits.

Vamos a meternos en harina (en el tema de las guest additions, no era un chiste sobre Albert Rivera) ¿Cómo instalo la Guest Additions?

  • Abrimos un terminal y ejecutamos sudo apt-get install virtualbox-guest-additions-iso
  • Le llevará un ratillo (al menos a mi me lo llevó). Al acabar vamos al menú desplegable de la esquina inferior izquierda, seleccionamos Preferencias y desde allí escogemos Software y Actualizaciones. Os dejo esta imagen ilustrativa:
    Lubuntu software actualizacións
  • Ahora nos queda desmarcar las opciones de usar los controladores de Virtual Box en lugar de los de serie del sistema operativo, tal que así: Software y Actualizaciones

Y tras un reinicio la cosa debería ir ya como la seda.

Incluir java en el PATH de Windows

Aunque no siempre es necesario, a veces nos tocará modificar la variable PATH de Windows y añadir la ubicación de Java para utilizar algún software concreto.

Todavía no he tenido que hacerlo en Windows 10, pero os comento cómo va la coas en Windows 8 y Windows 7. Voy a omitir XP porque al estar descontinuado no es cosa de darle soporte (de hecho la propia Oracle no asegura el funcionamiento de las últimas versiones de Java, aunque con el SP3 funciona de momento).

Vamos con las instrucciones para Windows 7:

  1. Abrimos el menú de inicio y hacemos click derecho sobre Equipo y, en el menú contextual seleccionamos Propiedades del Sistema.
  2. Hacemos click en Configuración avanzada del sistema -> Opciones avanzadas.
  3. Hacemos click en Variables de entorno, allí en Variables del sistema, buscamos PATH y hacemos click en él.
  4. En la ventana Editar, modificamos PATH agregando la ubicación de java en nuestro equipo al valor de PATH.

Y ahora las instrucciones para Windows 8:

  1. Hacemos click en Búsqueda y buscamos Panel de control
  2. Ahí hacemos click en Panel de control -> Sistema -> Opciones avanzadas
  3. Ahí vamos a Variables de entorno, y ahí en Variables del sistema, buscamos PATH y hacemos click en él.
  4. En la ventana Editar, modificamos PATH agregando la ubicación de java en nuestro equipo al valor de PATH.

En cuanto lo tenga que hacer en Windows 10 os lo agrego por aquí.

CSS: el pseudo-elemento ::selection

¿Quieres definir un estilo para el texto seleccionado? ¿que el color de fondo sea verde moco? ¿que la leta se ponga en añil? Con CSS esto es posible utilizando el pseudo-elemento ::selection.

Debemos empezar recalcando que ::selection no pertenece a la especificación standar de CSS3 (estaba presente en los borradores, pero se eliminó de la especificación final), por tanto no está garantizado su funcionamiento en todos los navegadores. A pesar de eso tiene bastante compatibilidad, al menos con los navegadores para sistemas operativos de escritorio (y por otra parte, en un dispositivo móvil no es muy habitual andar seleccionando texto, al menos en mi caso). En caniuse podéis comprobarlo.

Si habéis ojeado el enlace anterior veríais que además en el caso de Firefox hay que usarlo con el prefijo -moz. En todo caso, este pseudo-elemento sólo acepta un pequeño grupo de reglas CSS: color, background, background-color y text-shadow. Ojo con querer utilizar una imagen de fondo, porque background-image será ignorado, igual que el resto de reglas que no sean las cuatro antes citadas.

Vamos con un ejemplillo de cómo funciona esto. Para ello usaremos nombres de clase llamados ejemploN a los que sumaremos el pseudo-elemento:

/*Empezamos por el color de fondo, gris*/
.ejemplo1::selection{
    background-color:#555555;
}
.ejemplo1::-moz-selection{
    background-color:#555555;
}
/*Ponemos la letra en rojo*/
.ejemplo2::selection{
    color:#FF0000;
}
.ejemplo2::-moz-selection{
    color:#FF0000;
}

/*Ponemos la letra en negro y el color de fondo gris claro*/
.ejemplo3::selection{
    background-color:#cccccc;
    color:#000000;
}
.ejemplo3::-moz-selection{
    background-color:#cccccc;
    color:#000000;
}

/*Le ponemos sombra al texto seleccionado*/
.ejemplo4::selection{
    text-shadow: 1px 1px 0 #27ae60;
}
.ejemplo4::-moz-selection{
   text-shadow: 1px 1px 0 #27ae60;
}

Puede ser un efecto interesante, pero repito que no forma parte de la especificación, no es un standar y por tanto puede que en un futuro de problemas o no funcione correctamente. Nos tocará esperar.