Creando contraseñas en Linux con mkpasswd

El programa mkpasswd, que es parte del paquete whois, nos permite generar contraseñas complejas y seguras a través de diversos algoritmos criptográficos.

Si no lo tienes instalado puedes agregar el paquete whois tal que así:

sudo apt-get update
sudo apt-get install whois

Una vez tengamos whois instalado ya podemos hacer uso de mkpasswd. Veamos que opciones tiene:

  • -m: Nos permite elegir el método con el que encriptaremos: entre des, md5,sha-256 y sha-512.
  • -5: Es una forma abreviada para seleccionar el método md5, sería equivalente a usar -m md5.
  • -S: Una cadena que usar como salt para el password.
  • -R: Definimos el número de rondas que se usarán, si son aplicables.
  • -P: Lee la contraseña del descriptor de fichero que le pasemos en lugar de hacerlo de /dev/tty
  • -s: Método acortado equivalente a -P 0

Por ejemplo:

#usamos el algoritmo sha-256
#pasamos como sal la cadena salamos1
mkpasswd -m sha-256 -S salamos1

#lo mismo pero con md5
mkpasswd -m md5 -S salamos1

Una captura viendo distintas opciones, distintos algoritmos y comprobando también cómo el salt no permite ciertos carácteres:
mkpasswd

Javascript: Obtener el último carácter de una cadena

Ayer veíamos cómo obtener la primera letra de una cadena, hoy vamos a ver cómo obtener la última. Básicamente es lo mismo que en el otro ejemplo: usamos la función charAt(), pero en este caso en vez de un 0 le pasamos la longitud de la cadena restándole el último carácter (obtenemos la longitud a través de la propiedad length de la cadena). Tal que así:

#Un ejemplo donde haremos un alert
#de la última letra de una cadena

var cadena = "abc";
window.alert(cadena.charAt(cadena.length-1));

Javascript: obtener el primer carácter de una cadena.

¿Cómo se obtiene el primer carácter de una cadena con javascript? Pues es muy simple: con la función charAt(). Dicha función recibe como parámetro la posición dentro de la cadena en la que queremos buscar y devuelve el carácter que está en esa posición. Así que para obtener el primer carácter tenemos que pasarle un 0. Tal que así:

var cadena= "cadena";
var fstChar = cadena.charAt(0);

Reparar Sambacry (CVE-2017-7494) en Ubuntu

Tras todo el tema de Wannacry atacando sistemas Windows hace un par de semanas ahora aflora otra vulnerabilidad que afecta al protocolo SMB en Samba, afectando a las versiones 3.5 y posteriores, lanzada en marzo de 2010. El fallo ha sido reportado y descrito por Samba en su sitio oficial como CVE-2017-7494.

Ya se ha reparado el problema, así que si no tienes actualizado Samba es el momento de hacerlo. Las versiones para Ubuntu en las que ya se ha aplicado el parche son las siguientes:

  • 17.04: samba 2:4.5.8+dfsg-0ubuntu0.17.04.2
  • 16.10: samba 2:4.4.5+dfsg-2ubuntu5.6
  • 16.04 LTS: samba 2:4.3.11+dfsg-0ubuntu0.16.04.7
  • 14.04 LTS: samba 2:4.3.11+dfsg-0ubuntu0.14.04.8

Para actualizar Samba y ver qué versión tienes instalada en tu Ubuntu puedes usar los siguientes comandos:

#instalar
$ sudo apt-get update
$ sudo apt-get install samba

#y para comprobar la versión
$ sudo apt-cache show samba

Si por lo que sea no puedes actualizar Samba comprueba que tengas SELinux habilitado, en caso afirmativo ya deberías estar protegido contra la ejecución de código remoto en tu equipo. También puedes poner la opción noexec en las unidades compartidas por Samba para evitar la ejecución de binarios en las mismas.

En la sección [global] del fichero smb.conf también puedes añadir la siguiente línea y luego reinciar el servicio:

nt pipe support = no

Ojo con esto último, puede dar problemas con los permisos para acceder a carpetas a los usuarios de Windows. Por ejemplo, les forzaría a poner la dirección completa del directorio compartido, no bastando sólo con la del directorio raíz.

cmd.fm, un servicio on-line de radio controlado por línea de comandos

Vamos con una de las frikadas de la semana: cmd.fm

¿Qués es cmd.fm? Pues es un servicio on-line de radio que se nutre de música alojada en Soundcloud. No suena a nada especialmente revolucionario pero tiene una característica que lo hace curioso: se maneja desde una interfaz de línea de comandos. Es un módulo de cmd.to, un sistema operativo en línea con diversas utilidades a través de comandos.

A través de fm help obtenemos la siguiente lista de comandos, que nos explican como manejar esta aplicación:

fm {cmd}..................Lista géneros y ejecuta comandos de fm
fm genres.................Lista todos los géneros. fm genres
fm play {o}...............Este comando permite reproducir un género o volver a arrancar una pista pausada. fm play chillout | fm p username/playlist | fm p me/playlist
fm pause..................Pausa la reproducción. fm pause
fm resume.................Vuelve a reproducir tras pausa. fm resume
fm next...................Salta a la siguiente pista fm next | fm skip
fm previous...............Salta a la pista anterior fm prev | fm back | fm previous
fm info...................Muestra información sobre la pista que se está reproduciendo fm i | fm info | fm information
fm loop {n}...............Repite la pista actual el número N de veces que digamosfm loop
fm unloop.................Detiene el bucle actual de repeticiones fm unloop
fm forwards {n}...........Avanza N segundos en la pista actual. fm fw 5 | fm forwards 5
fm backwards {n}..........Retrocede N segundos en la pista actual. fm bw 5 | fm backwards 5 | fm rewind 5
fm volume {n}.............Define el volumen en porcentaje fm v 50 | fm vol 50 | fm volume 50
fm mute...................Silencio! fm m | fm mute
fm unmute.................Desactiva el mute. fm um | fm unmute
fm share..................Comparte la pista actual. fm share
fm like...................Marca un like en la pista actual. fm like
fm unlike {track_id}......Retira el like a la pista actual. fm unlike | fm unlike {track_id}
fm likes..................Muestra o reproduce tus likes. fm likes | fm likes play
fm playlists {username}...Muestra tus listas de reproducción o explora las de otros usuarios. fm playlists
fm test {genre, mood}.....Test test
fm playlist {cmd, playlist_name}Gestiona o escucha listas de reproducción fm playlist new / add / remove / show / play / edit / destroy {playlist_name}
fm help...................Muestra la ayuda (esta lista pero en inglés). fm help
fm migrate................Permite migrar listas de reproducción de cmd.fm fm migrate

jQuery: enviando un formulario con ajax

No sabía sobre qué escribir, pero esta semana me preguntaron por esto así que puede ser cosa buena contarlo también por aquí.

Bueno, el primer punto a tener en cuenta es que jQuery nos ofrece varios métodos para realizar envío por ajax: el método post() (que hace una petición por post), el método get() (lógicamente por get) o el método ajax(). Para este ejemplo usaremos este último.

jQuery, por otra, parte nos permite no enviar todo el formulario sino sólo una lista de valores que podemos coger nosotros de los campos para, por ejemplo, realizar validaciones que necesiten consultas del lado del servidor. Pero para el ejemplo enviaremos todo el formulario.

En este caso vamos a suponer que tenemos un formulario con el id formulario que tenemos que enviar a una página llamada procesa.php, que a su vez nos devuelve una cadena de texto informándonos del éxito de la operación. La acción del envío se activa cuando hacemos click sobre un elemento con el id enviar. Sobre la cabecera de nuestro formulario hay un div con el id resultado donde podemos informar al usuario del resultado de su envío. Vamos entonces con el código jQuery:

<script type="text/javascript">   
$(function(){
  $("#enviar").click(function(){
    $("#resultado").html("<p id='enviando'>Enviando datos</p>");
    $.ajax({
      method: "POST",
      url: "procesa.php",
      data: $("#formulario").serialize()
    })
    .done(function( msg ) {
      $("#enviando").hide();
      $("#resultado").html("Formulario enviado:" + msg);
    })
    .fail(function() {
      $("#enviando").hide();
      $("#resultado").html("Se ha producido un error y no se han podido procesar los datos");
    })
  });
});
</script>

Linux: Cómo añadir un nuevo disco a un RAID 0

Ayer me econtraba en la siguiente tesitura: un servidor Ubuntu con dos discos en RAID0 al que hay que añadir un tercer disco pero sin borrar los datos que ya hay en el array. ¿Cómo lo hago? Esto me funcionó para un Ubuntu Server con kernel 4.4 así que en SO bastante nuevos debería funcionar.

Bueno, desde la versión 2.6.35 del kernel es posible hacerlo con mdadm con el siguiente comando. Para el ejemplo supongamos un raid llamado md1 con dos discos y un nuevo disco llamado sdd

mdadm --grow /dev/md1 --level=0 --raid-devices=3 --add /dev/sdd

Básicamente usamos grow sobre el array que ya tenemos, ponemos el número de discos que serán ahora en raid-devices y finalmente ponemos qué disco añadimos con add.

Comandos básicos de Linux para gestión de procesos

Un tip rápido y práctico como el de los puertos del otro día (lo estoy haciendo para un compañero de trabajo) ¿Cuáles son los comandos básicos de Linux para la gestión de procesos del servidor?:

  • ps: muestra los procesos activos.
  • ps aux: ps pero con más detalle.
  • kill pid: mata los procesos con el pid pid
  • killall proc: mata todos los procesos llamados proc
  • bg: lista los procesos parados o en segundo plano, arranca procesos parados en segundo plano.
  • fg: trae el proceso más reciente a primer plano.
  • fg n: trae el proceso n a primer plano.

Conocer los datos de nuestra placa base en Windows

En su día vimos cómo ver los datos de nuestra memoria RAM en Windows. Hoy me preguntaba un compañero del curro si podía ver los de la placa base sin tener que abrir el ordenador. Le comenté que sí, que con wmic desde una consola de comandos es posible:

wmic baseboard

Pero claro, eso sacará un churro de texto que es cosa larga y casi ilegible. Por suerte podemos filtrar qué parámetros queremos:

wmic baseboard get product,Manufacturer,version,serialnumber

De esta forma sacamos producto, fabricante, modelo y número de serie, de forma ordenadita y clara.

wmic baseboard

También es posible sacar los resultados a un fichero de texto por si nos resulta más cómodo para trabajar.

wmic baseboard > ficherotexto.txt

Deshabilitar el botón «atrás» del navegador con Javascript

Esto fue una ñapa que hice en su día para un curso en el que era alumno. Uno de los profesores se pispó de que en los exámenes de la plataforma virtual los alumnos podían hacer todo el examen, ver la autocorrección de la plataforma, volver hacia atrás pulsando el botón de retroceder del navegador y repetirlo. Como había buen rollo y sabía que yo era programador me preguntó si había una forma de bloquear el botón «retroceder» del navegador… y se lo arreglé con esto:

//primero añadía esta línea de javascript
<script type="text/javascript">
    window.history.forward();
    function sinVueltaAtras(){ window.history.forward(); }
</script>
//y en el body invocaba la función en la carga
<BODY onload="sinVueltaAtras();" onpageshow="if (event.persisted) sinVueltaAtras();" onunload="">

¿Qué hace este código? Pues no deshabilita exactamente el botón atrás, lo que hace es que la página automáticamente se vaya hacia delante. Al ponerlo en la cabecera de la página que cargaba las preguntas hacía que si el alumno retrocedía al cargar la página automáticamente volviera a la última.

La mejor solución habría sido que la plataforma no realizara la autocorrección hasta haber enviado el examen… pero eso ya se lo habría tenido que cobrar.