domingo, 16 de septiembre de 2012

Recuperar usuario en Wordpress


Finalmente logramos recuperar el server, que sirve mi propio sitio (ulijese.no-ip.org) y el de mi esposa (sop.no-ip.info). Se puede hablar de un milagro, ya que al server sólo se le había quemado la fuente de alimentación, y cambiándola se solucionaron una parte de los problemas, pero hacer reaccionar el disco rígido llevó tiempo.
Finalmente, con la fuente ya cambiada y el rígido funcionando, el server comenzó a funcionar como siempre, es decir, uno enciende la pc y la deja allí, trabajando sola y abandonada, confiando en que nada puede salir mal.
Y claro, nada anda mal, y como nada anda mal, pues podemos ir haciendo alguna cosa... en particular, la página de mi mujer es algo viejita, la hizo ella cuando a duras penas tenía idea de HTML, así que pensamos hace un tiempo que no estaría mal que actualizáramos su formato. Instale Wordpress, creé la base de datos, me lié con la creación de los usuarios y los permisos y tuve todo ese tipo de problemas que suelen tenes los hobbistas... pero al final logré hacer correr Wordpress tanto para mi sitio como para el de mi señora.
De eso pasó un año, mes más, mes menos, y en mi blog no tengo problemas, ya que accedo al él con regularidad; otro cantar fue cuando hace algunos días quise retomar la tarea de actualizar el sitio de mi señora... no recordaba qué contraseña tenía el usuario administrador.
Eso me lleva a contar por qué escribo este post: no es más que una excusa para recordarme cómo recuperar la clave la próxima vez que lo olvide.
Algunos datos:
La base de datos que corre en la pc que hace de server es mysql; tengo acceso al server por ssh. Googleando por ahí, me enteré que la clave de los usuarios está encriptada. Lo lógico, entonces, era (y es):
  1. Entrar a la base de datos.
  2. Buscar la tabla de usuarios (no era dificil, solo está dado de alta la cuenta del admin)
  3. Borrar de la tabla el valor de la contraseña
  4. Generar una nueva clave, y ponerla encriptada en el lugar de la contraseña que borré antes.
  5. Entrar desde la página y modificar nuevamente la contraseña.
Suena fácil, y es fácil si se lo hace regularmente; yo solo meto mano a las bases de dato una o dos veces al año; me costó mucho. Además, ví que mucha gente utiliza phpadmin, y yo desconocía su existencia. Mi experiencia fue pura consola. No me avergüenza.
En fin...
1.- Accedí al server (llamado ochentayseis) desde mi pc, la noventaynueve, que tiene , para este ejemplo, una ip xxx.xxx.xxx.xxy, vía ssh, desde una xterm; se debe reemplazar xxx.xxx.xxx.xxx por la ip que tenga cada uno:
julian@noventaynueve:~$ ssh -l root xxx.xxx.xxx.xxx
root@xxx.xxx.xxx.xxx's password:
Last login: Sun Sep 16 01:08:04 2012 from xxx.xxx.xxx.xxy
Linux 2.6.38.7.

2.- Una vez logueado, entre a mysql y fui tirando comandos hasta resolver el problema; primero muestro todos los pasos, luego los explico:

root@ochentayseis:~# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48892
Server version: 5.1.56 Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use blog 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>  show tables;
+---------------------------+
| Tables_in_blog            |
+---------------------------+
| wp_blogcommentmeta        |
| wp_blogcomments           |
| wp_bloglinks              |
| wp_blogoptions            |
| wp_blogpostmeta           |
| wp_blogposts              |
| wp_blogterm_relationships |
| wp_blogterm_taxonomy      |
| wp_blogterms              |
| wp_blogusermeta           |
| wp_blogusers              |
+---------------------------+
11 rows in set (0.00 sec)

mysql> describe wp_blogusers;
+---------------------+---------------------+------+-----+---------------------+----------------+
| Field               | Type                | Null | Key | Default             | Extra          |
+---------------------+---------------------+------+-----+---------------------+----------------+
| ID                  | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| user_login          | varchar(60)         | NO   | MUL |                     |                |
| user_pass           | varchar(64)         | NO   |     |                     |                |
| user_nicename       | varchar(50)         | NO   | MUL |                     |                |
| user_email          | varchar(100)        | NO   |     |                     |                |
| user_url            | varchar(100)        | NO   |     |                     |                |
| user_registered     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| user_activation_key | varchar(60)         | NO   |     |                     |                |
| user_status         | int(11)             | NO   |     | 0                   |                |
| display_name        | varchar(250)        | NO   |     |                     |                |
+---------------------+---------------------+------+-----+---------------------+----------------+
10 rows in set (0.03 sec)

mysql> SELECT user_login FROM wp_blogusers;
+------------+
| user_login |
+------------+
| admin      |
+------------+
1 row in set (0.00 sec)

mysql> SELECT user_pass FROM wp_blogusers;
+------------------------------------+
| user_pass                          |
+------------------------------------+
|  1f13e4646e9b8f517f8232e9e1a8bdd4  |
+------------------------------------+
1 row in set (0.00 sec)

mysql> update wp_blogusers set user_pass="" where user_login="admin";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT user_pass FROM wp_blogusers;
+-----------+
| user_pass |
+-----------+
|           |
+-----------+
1 row in set (0.00 sec)

mysql> update wp_blogusers set user_pass="81dc9bdb52d04dc20036dbd8313ed055" where user_login="admin";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT user_pass FROM wp_sopblogusers;
+----------------------------------+
| user_pass                        |
+----------------------------------+
| 81dc9bdb52d04dc20036dbd8313ed055 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> quit
Bye
root@ochentayseis:~#

Hay mucho para contar; empezamos por:
mysql -u root -p

que es el comando que usamos para entrar a la cosola Mysql, con -u xxxx indicamos que xxxx es el usuario que accederá, en mi caso, fue con root; con -p indicamos que nos deje poner la contraseña.
Luego usamos el comando use:

mysql> use blog

De acuerdo al manual de Mysql:
El comando USE db_name le dice a MySQL que use la base de datos db_name como la base de datos por defecto para los comandos siguientes. Sigue siendo la base de datos por defecto hasta el final de la sesión o hasta que se realiza otro comando USE
En este caso estaríamos trabajando en la base de datos llamada blog.
El comando show tables; (el punto y coma es parte del comando) nos muestra las tablas que tiene la base de datos blog. En esas tablas vemos que está la de usuarios (la llamada wp_blogusers), que es la que nos interesa.
Luego hacemos:

mysql> describe wp_blogusers;

De acuerdo al manual de mysql:
DESCRIBE proporciona información acerca de columnas en una tabla
Dentro de la tabla wp_blogusers está la columna Field, que contiene los valores  user_login, es decir, los de logueo de cada usuario del blog, y user_pass, es decir, el password.
Usé el comando SELECT para ver los valores que tenían user_login y user_pass. A esta altura ya estamos cerca de la solución. Primero borro el valor de la contraseña del admin:

mysql> update wp_blogusers set user_pass="" where user_login="admin";

Donde dice set user_pass="", estamos diciendo, en realidad, que se reemplace el valor anterior con lo tenemos entre las comillas, en este caso, nada. Para comprobar que realmente no había quedado nada en ese campo, repetí el comando 

mysql> SELECT user_pass FROM wp_blogusers;

que mostró user_pass vacío.

Luego fui a una página en la que generé un hash con una cadena conocida; en el ejemplo, 1234. Es decir, por un lado, el admin se loguearía desde el login de la página con el valor 1234, pero en la base de datos este valor debe estar encriptado; la página enlazada nos da el valor que tendrá 1234 ya encriptado; dicho valor se vuelca a nuestra base de datos de la siguiente forma:

mysql> update wp_blogusers set user_pass="81dc9bdb52d04dc20036dbd8313ed055" where user_login="admin";

El último SELECT lo hago para comprobar que realmente se ha asignado el valor al usuario, y todo listo, ya me puedo desloguear tranquilo de la consola mysql, de la sesión ssh y puedo entrar al blog con el usuario admin y la contraseña 1234; más tarde, pero ya desde el propio blog, cambiaré a una contraseña más segura.

Eso fue todo! Espero que le sirva a alguien, aunque estoy seguro que muchos tienen una herramienta como phpadmin que facilita mucho las cosas.

No puedo dejar de nombrar -y agradecer- este post que fue el que me mostró un poco el camino a seguir, y que, en difinitiva, muestra como hacer esto mismo pero sin tanta consola.

Saludos!



No hay comentarios:

Publicar un comentario