Archivo de la etiqueta: linux

Error WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! al intentar conectarse por ssh

Esto era novedad. He tenido que formatear un servidor y al intentar conectarme de nuevo desde otro servidor del que ya me conectaba antes recibo este error:

david@backups:~/.ssh$ ssh root@172.31.0.41

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
d4:22:66:d1:7a:83:e4:77:75:d0:e8:ec:52:d9:1d:aa.
Please contact your system administrator.
Add correct host key in /home/david/.ssh/known_hosts to get rid of this message.
Offending key in /home/david/.ssh/known_hosts:10
RSA host key for 172.31.0.41 has changed and you have requested strict checking.
Host key verification failed.


Claro, evidentemente la clave RSA había cambiado y no correspondía con la que había guardada en el fichero known_hosts y no era posible la conexión.

La solución la da el propio mensaje, la clave obsoleta se encontraba en la linea 10 de mi fichero known_host tal y como dice el mensaje de error.

Eliminamos la huella antigua con el siguiente comando:

$ sed -i 10d ~/.ssh/known_hosts

Notese que en el comando he puesto que borrase la linea 10. Y ya puedo conectarme de nuevo ya que ofrece la nueva huella de la nueva identidad del servidor nuevo.

En caso de querer añadir de nuevo la clave publica al nuevo servidor tan solo hemos de ejecutar el siguiente comando:

david@backups$ cat ~/.ssh/id_rsa.pub | ssh root@172.31.0.41 ‘cat – >> ~/.ssh/authorized_keys’

Matar procesos zombie en Ubuntu

Hay una forma de matar los procesos zombie muy sencilla, para ello primero hay que detectarlo y suele ser al iniciar sesión en un servidor que nos da un mensaje indicándolo o a través del comando top.

Los procesos zombies pueden ser identificados en la salida por pantalla del comando de Unix ps por la presencia de una Z en la columna de estado. Por ello para poder encontrar cual es el proceso ejecutamos el comando:

$ sudo ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘

y para eliminarlo:

$ sudo kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘ | awk ‘{print $2}’`

Ejecutar un shutdown, reboot o halt con sudo sin introducir password

Andaba hace tiempo detrás de esta manera de poder ejecutar remotamente un shutdown -h now.

Mi intento está basado en un script que me realizaba una serie de copias de seguridad y las alojaba en un servidor remoto en mi casa, Me faltaba este pequeño paso pero que me tenia amargado. Se trata de que después de hacer las distintas copias de seguridad, subirlas al servidor de mi casa y al termino necesitaba que el servidor alojado en mi casa se apagase después de haber terminado de subir el backup.

No voy a detallar el script porque no viene al caso. Evidentemente para la conexión remota en mi casa utilicé las claves publicas y privadas, de esta forma no es necesario introducir la contraseña y puede hacerse un script bash (sh) para que no sea necesaria la intervención humana.

Hasta que di con esta solución, el servidor de mi casa permanecía encendido hasta que por la mañana lo apagaba con el sudo shutdown -h now que inevitablemente me pedia la contraseña de sudo.

Asi de sencillos son los pasos:

  1. Usa el comando: $ sudo visudo
  2. Busca la linea que pone "# User alias specification" y añade tu usuario que tendrá ese privilegio. La linea quedará:
    #User alias specification
    User_Alias USERS = tuusuario
  3. Ahora busca la linea # Cmnd alias specification" y añade una lista de comando como la siguiente:
    # Cmnd alias specification
    Cmnd_Alias SHUTDOWN_CMDS = /sbin/shutdown, /sbin/reboot, /sbin/halt
  4. Ahora busca la linea que contiene "%admin ALL=(ALL) ALL" y añade el comando SHUTDOWN_CMDS que dejarás al usuario ejecutar sin contraseña de la siguiente manera:
    %admin ALL=(ALL) ALL
    USERS ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS

Ya no te preguntará la contraseña de sudo para ese usuario.

Puedes añadir el privilegio a mas usuarios añadelos después de tuusuario (en el punto 2) con una coma de la forma:
User_Alias USERS = tuusuario, otro_usuario

Después de esto, al poner en mi script remoto "ssh tuusuario@servidor sudo shutdown -h now" se apaga el servidor sin solicitar la contraseña de sudo y hace posible el apagado remoto.

Encriptación de un fichero en Ubuntu mediante OpenSSL

En ocasiones nos es necesario encriptar un fichero para evitar que ojos ajenos puedan ver información relevante nuestra.

A continuación os voy a dar un par de comandos sencillos mediante OpenSSL que nos permitirán encriptar un fichero para estar seguros de que información que contiene no sea vista por nadie.

Se trata de usar OpenSSL para encriptar nuestros ficheros de manera que podamos proteger el contenido del mismo mediante el uso de una contraseña. Puede usarse tanto como para ficheros de texto como binarios, por ejemplo una imagen.

OpenSSL es un conjunto de utilidades para criptografia de ficheros. Si no lo tienes instalado debes ejecutar:

$ sudo apt-get install openssl

Para encriptar un fichero ejecuta:

$ openssl aes-256-cbc -a -salt -in fichero_a_encriptar.txt -out fichero_encriptado.txt.enc

Nos pedira que escribamos una password y la confirmemos.

Tambien podemos añadir la contraseña en el mismo comando y asi poder integrarlo en un script bash de la siguiente manera:
$ openssl aes-256-cbc -a -salt -in backup.tar.gz -out backup.tar.gz.enc -pass pass:tupassword

Para desencriptar el fichero del primer ejemplo ejecutamos:

$ openssl aes-256-cbc -d -a -in fichero_encriptado.txt.enc -out fichero_desencriptado.txt

Calcula el tiempo en ejecutarse un script bash en shell de linux

A veces nos es muy útil saber que tiempo ha tardado en ejecutarse un script bash desde la línea de comandos de linux.

Es muy sencillo, tan solo hay que tomar los valores del tiempo en un par de variables y obtener la diferencia.

Voy a hacer un ejemplo de archivo bash para que todo quede explicado obteniendo la diferencia en minutos:

Creamos un archivo “scriptdiff.sh” con el editor que prefieras y en el contenido pondremos:

#!/bin/bash
START=$(date +%M)

# comienzo de tu script, por ejemplo

wget ftp://usuario:password@davidsuarez.es/backup/backup.dmp.gz
……..
# termina tu script

END=$(date +%M)

DIFF=$(( $END – $START ))

echo “Ha tardado la friolera de $DIFF minutos”

Para hacer el fichero ejecutable:

$ chmod +x scriptdiff.sh

Para ejecutarlo:

$ ./scriptdiff.sh

Así de simple, luego podéis hacer variaciones para que el tiempo te lo muestre en segundos (sustituir %M por %s), en nanosegundos para scripts rápidos ($(date +%s%N)), etc…