Hace un tiempo tuvimos que cambiar la estructura de permalinks de wordpress del formato http://dominio/año/mes/contenido a http://dominio/contenido y decidimos hacer que el nginx hiciera un 301 del formato viejo al nuevo.

Es algo tan sencillo como esto:

rewrite "^/[\d]{4}/[\d]{2}/(.*)\/$" /$1/ permanent;

Espero que os sea útil.

Este mini script funciona con plesk 9 en adelante. Yo lo utilizo para luego poder importar los emails en otro servidor con virtualmin con la ventaja de que mantiene las contraseñas de los emails.

for d in $(mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa -Ns -e "select displayName from domains where domains.status=0;"; do echo $d; /usr/local/psa/bin/pleskbackup domains-name $d  --only-mail --output-file=/var/tmp/$d.backup ;done

OSMC es una distribución basada en debian que permite tener una instalación limpia de Kodi en multitud de dispositivos.

En mi caso lo probé con la Raspberry Pi 3 y va de cine pero me encontré con el problema de que no detectaba el wifi de casa, si que veía otros wifis cercanos pero justo el mío no. Investigando un poco me di cuenta de que el problema estaba en el canal de la wifi, el canalen E.E.U.U. no pueden usar el canal 12 de la banda de 2.4Gh que tenía configurado era el 12, si lo cambiaba a otros canales mas bajos la raspberry lo detectaba sin problemas.

Por lo visto en E.E.U.U. no pueden usar el canal 12 de la banda de 2.4Gh (802.11b/g) así que probablemente el problema está en que la definición de la zona geográfica está mal.

Para corregirlo hay que instalar los paquetes iw y crda

sudo apt-get install iw crda

Si compruebas la zona verás

iw reg get

country 00: DFS-UNSET
(2402 – 2472 @ 40), (N/A, 20), (N/A)
(2457 – 2482 @ 40), (N/A, 20), (N/A), NO-IR
(2474 – 2494 @ 20), (N/A, 20), (N/A), NO-OFDM, NO-IR
(5170 – 5250 @ 80), (N/A, 20), (N/A), NO-IR
(5250 – 5330 @ 80), (N/A, 20), (0 ms), DFS, NO-IR
(5490 – 5730 @ 160), (N/A, 20), (0 ms), DFS, NO-IR
(5735 – 5835 @ 80), (N/A, 20), (N/A), NO-IR
(57240 – 63720 @ 2160), (N/A, 0), (N/A)

Si lo cambias a mano verás que cambia:

iw reg set ES

country ES: DFS-ETSI
(2400 – 2483 @ 40), (N/A, 20), (N/A)
(5150 – 5250 @ 80), (N/A, 23), (N/A), NO-OUTDOOR
(5250 – 5350 @ 80), (N/A, 20), (0 ms), NO-OUTDOOR, DFS
(5470 – 5725 @ 160), (N/A, 26), (0 ms), DFS
(57000 – 66000 @ 2160), (N/A, 40), (N/A)

Al cambiarlo a mano cuando reinicies se perderá, así que lo mejor es editar el fichero /etc/default/crda y cambiar REGDOMAIN=ES

Si estas en otro país en /usr/share/zoneinfo/zone.tab están todos los códigos de los países.

Ayer tuve el placer de participar en un webinar junto a Dabo @daboblog, Diego Mtnz Castañeda @n1mh, Oscar Reixa @oreixa. de Apachectl dentro de los webinars de desarrolloweb, en el que charlamos sobre servidores cloud y dedicados. Creo que es un webinar interesante para los que tengan dudas sobre que tecnología aplicar para sus desarrollos.

 

Os recomiendo echar un ojo al canal de desarrolloweb.com porque hay una cantidad de información alucinante sobre muchísimos temas tanto de desarrollo como de diseño.

Este es un truco rápido para ejecutar un comando en el momento en que te conectas por ssh a un servidor. Sólo tienes que editar el fichero ~/.bashrc de tu usuario o /etc/bash.bashrc si lo quieres hacer para todos los usuarios del servidor y añadir el código siguiente sustituyendo el echo que he puesto por el comando o comandos que quieras ejecutar.

if [[ -n $SSH_CONNECTION ]] ; then
echo "Bienvenido guapetón"
fi

En servidores donde hay un gran trasiego de imágenes puede ser muy útil el instalar un sistema de compresión y optimización de imágenes en batch desde el servidor.
Para hacer la compresión de las imágenes vamos a utilizar jpegoptim para las imágenes jpeg y optipng para los png, otras opciones válidas para los png son pngcrush advancecomp.
La premisa principal del scrip es comprimir lo máximo posible sin pérdida de calidad.

Lo primero es instalar las aplicaciones:

apt-get install jpegoptim optipng

El script que utilizo para hacer la compresión es este, tened en cuenta que uso un find sin límite superior por lo que comprimirá todas las imágenes de la ruta indicada y de todas las rutas que estén por encima de ella.

p.e.:

comprimir_imagenes.sh /opt/imagenes

comprimirá las imágenes de /opt/imagenes y de /opt/imagenes/a, /opt/imagenes/a/1, /opt/imagenes/a/1/2, etc.

#!/bin/bash
echo " "
if [ ! -z "$1" ]
then
	INIT_DIR=$1
	find $INIT_DIR -type f -name "*.jpg" | xargs -I ARG jpegoptim -p -f ARG
	find $INIT_DIR -type f -name "*.jpeg" | xargs -I ARG jpegoptim -p -f ARG
        find $INIT_DIR -type f -name "*.png" | xargs -I ARG optipng -preserve -o7 ARG
else
	echo ""
        echo "Hay que indicar el directorio a partir del cual se quiere comprimir"
        echo " "
        echo "Formato:"
        echo "./optimizar_imagenes.sh /var/directorio/"
fi
echo " "

Tened en cuenta que las imágenes comprimidas tendrán el usuario y grupo del usuario que ejecute el script.

Todos los que tenemos algún wordpress y revisamos los logs periódicamente vemos que continuamente hay accesos por POST al xmlrpc.php. Algunas veces son ataques y otras son simples consultas de bots. En cualquier caso son accesos que no me valen para nada y generan tráfico innecesario.

Hace poco revisando unos logs vi miles de accesos por POST desde una ip de Ucrania y con el user agent de GoogleBot. No se que quería pero seguro que nada bueno. 🙂

Lo que recomiendan en muchos sitios de borrar ese fichero a mi no me convence por que si actualizas el wordpress lo vuelves a tener ahí y hay veces que se hace un uso legítimo de ese fichero para, p.e. publicar post desde programas externos.

Una característica habitual de los bots es que hacen las peticiones por HTTP/1.0 en vez del habitual HTTP/1.1 así que aprovechando esta característica he preparado este pequeño código que bloquea las peticiones por POST y HTTP1.0 al xmlrpc.php. Obviamente si el bot trabaja con HTTP/1.1 esto no funcionará.

Lo más interesante de este código es que para evitar ifs anidados concateno dos valores en una variable. Si se cumple la primera condición el valor de la variable es “bot” y si se cumple la segunda añado a lo que tenga la variable el valor “post”, de esa forma sólo devuelve 403 si las dos variables cumplen la condición. Este método permite construir tantos ifs anidados como quieras, simplemente hay que añadir más valores a la cadena.

## Block xmlrpc.php POST http1.0
  location ^~ /xmlrpc.php {
    set $mata_bot 0;
    if ($server_protocol ~* "HTTP/1.0") {
        set $mata_bot "bot";
        }
    if ($request_method = POST ) {
        set $mata_bot "${mata_bot}-post";
        }
    if ($mata_bot = "bot-post"){
       return 403;
       }
   }

Espero que le sea útil a alguien más.

Información sobre ataques de fuerza bruta con xmlrpc.php

Este scrip en bash permite cambiar todas las claves de akismet de los blogs de un servidor. Simplemente busca todos los wp-config.php, saca los datos de acceso al mysql, comprueba si la clave que tienen metida es diferente de la nueva y si es así la cambia. Funciona perfectamente con wordpress multisite.

Acordaros de cambiar la clave y la ruta por la de vuestros servidores.

#!/bin/bash
 
CLAVE_AKISMET='mi_clave_akismet'
RUTA_WEB='/var/www/html/'
 
for WPCONFIG in $(find $RUTA_WEB -type f -name "wp-config.php")
        do
                DBNAME=$(grep "DB_NAME" $WPCONFIG | awk '{split($0,a,","); print a[2]}' | awk '{split($0,a,";"); print a[1]}' | sed -e 's/)//g' | sed -e "s/'//g" | tr -d " ")
                DBUSER=$(grep "DB_USER" $WPCONFIG | awk '{split($0,a,","); print a[2]}' | awk '{split($0,a,";"); print a[1]}' | sed -e 's/)//g' | sed -e "s/'//g" | tr -d " ")
                DBPASS=$(grep "DB_PASSWORD" $WPCONFIG | awk '{split($0,a,","); print a[2]}' | awk '{split($0,a,";"); print a[1]}' | sed -e 's/)//g' | sed -e "s/'//g" | tr -d " ")
                DBHOST=$(grep "DB_HOST" $WPCONFIG | awk '{split($0,a,","); print a[2]}' | awk '{split($0,a,";"); print a[1]}' | sed -e 's/)//g' | sed -e "s/'//g" | tr -d " ")
 
 
                if [ $(mysql -u $DBUSER -p$DBPASS -h $DBHOST $DBNAME -Ns -e "show tables;" | grep -c _options) -gt 0 ];
                then
 
                        for TABLA_OPTIONS in $(mysql -u $DBUSER -p$DBPASS  -h $DBHOST $DBNAME -Ns -e "show tables;" | grep "_options")
                        do
                                clave=$(echo "select option_value from "$TABLA_OPTIONS" where option_name='wordpress_api_key';" | mysql -u $DBUSER -p$DBPASS  -h $DBHOST $DBNAME -Ns)
                                if [ "$clave" != "$CLAVE_AKISMET" ];
                                then
                                        echo "Actualizando TABLA_OPTIONS:" $TABLA_OPTIONS
                                        echo "update "$TABLA_OPTIONS" set option_value='"$CLAVE_AKISMET"' where option_name='wordpress_api_key';" | mysql -u $DBUSER -p$DBPASS -h $DBHOST $DBNAME  -Ns
                                fi;
                        done
                fi;
        done

A veces es interesante acceder a algún servidor por ssh sin tener que introducir las claves. La forma más sencilla de hacerlo es:
1.- Comprueba si tienes ya creadas tu par de claves. Vete a /home/tu_usuario/.ssh/ y comprueba si existen los ficheros id_rsa y id_rsa.pub . Si no existen genéralos con

ssh-keygen

2.- Una vez que ya tienes tu par de claves copialas al host destino con

ssh-copy-id usuario@host_destino

Ahora ya podrás conectarte directamente a ese host sin necesidad de introducir la clave. Ten en cuenta que si hay un problema de seguridad en tu equipo estarás comprometiendo todos los equipos a los que te puedes conectar sin clave, úsalo con mucho cuidado.