Powershell: obtener la temperatura de la placa base en grados celsius.

¿Se puede obtener la temperatura de la placa base en Windows sin necesidad de apps externas y sin tener que entrar al a BIOS? Se puede con PowerShell.

Lo primero que tenemos que hacer es ejecutar PowerShell con permisos de administrador. Luego si ejecutamos este comando podríamos obtener un array con un par de lecturas de la temperatura de nuestra placa base en ese momento:

$(Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi").CurrentTemperature

Pero claro, esto no nos da la temperatura en grados celsius, ni siquiera en kelvin realmente. Si queremos ver esos datos tenemos que operar: si dividimos ese valor entre 10 obtendremos la temperatura en grados kelvin, después para convertir de kelvin a celsius habría que restar 273.15 grados. Estas operaciones podemos meterlas directamente en el comando que ejecutamos para no tener que andar haciendo cálculos manuales. Ojo, porque el objeto al que llamamos nos devuelve un array, para poder operar yo voy a acceder al primer elemento de la respuesta y forzar la conversión a entero para poder trabajar sin problema. Nos quedaría tal que así:

[int]($(Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi").CurrentTemperature[0])/10-273.15

Voy a recalcar que esta temperatura es la de la placa base y no la del procesador, que generalmente suele ser más alta.

Linux: matar procesos usando Kill, Pkill y Killall

Linux nos da tres opciones para matar procesos desde el terminal: kill, pkill y killall.

Antes de ver los tres comandos es importante recordad un punto: un usuario normal solo puede matar sus procesos, no los procesos del sistema o los de otro usuario. Un usuario root en cambio sí puede matar cualquier proceso, tanto del sistema como de otro. Realmente, a pesar de sus nombres, estos tres comandos no están pensados exclusivamente para matar procesos, sino que les pueden enviar todo tipo de señales, aunque sí es cierto que matar procesos es el comportamiento por defecto.

El comando kill nos permite matar un proceso identificándolo por su número identificador (PID), la sintaxis básica es kill -señal PID. El valor de la señal varía entre 64 posibilidades, siendo las que permiten matar procesos estas tres: SIGHUP (que se abrevia también con el valor numerico 1), SIGKILL(que se abrevia con el valor numérico 9) o SIGTERM(que se abrevia con el valor numérico 15). Si no ponemos ningún valor el tomado por defecto será 15, que es el más seguro pues no permite que se mate un proceso que esté en ejecución sino que espera a que termine y lo mata en ese momento, mientras que el valor 9 sería el más inseguro y contundente, mata al proceso incluso aunque esté ocupado. En el ejemplo siguiente veremos como matar un proceso que, por ejemplo, tenga el id 2015, primero con el valor por defecto y luego con la opción -9 o SIGKILL (las dos últimas sería la misma instrucción pero con distinta sintaxis):

kill 2015
kill -SIGKILL 2015
kill -9 2015

También podemos matar varios procesos en la misma instrucción. Imaginemos que queremos matar los procesos 2015, 2022 y 3049, solo tenemos que listarlos tras la instrucción kill separados por un espacio:

kill 2015 2022 3049

Si no queremos estar listando los procesos para poder ver sus PID podemos también matar un proceso por su nombre. Eso lo puedes hacer con el comando killall, que lo que hará será matar todos los procesos que coincidan con el nombre del comando. Imagina que quieres matar el proceso de mysql en tu servidor Linux, de esta forma lo harías, pero ojo porque si tienes varias instancias las mataría todas. Las señales para killall son distintas de las de kill, puedes listarlas ejecutando killall -l aunque coincide que el valor -9 también es el que podemos usar para matar el proceso de forma forzosa.

killall -9 mysql

Finalmente nos queda pkill, un comando que fue creado originalmente para el sistema operativo Solaris y cuyo funcionamiento es similar al de killall, la diferencia es que en este caso no necesitamos saber todo el nombre del proceso pues podemos usar exprexiones regulares para definir qué proceso queremos parar. Igual que en el ejemplo anterior veamos cómo terminaríamos el proceso de mysql, con el parámetro -e para que la consola nos informe de que lo ha eliminado.

pkill -e mysql

Usar Powershell para cambiar configuración de red entre pública y privada

Cuando hice el curso de fundamentos de Powershell hace un año me quedó algún artículo pendiente de escribir, por ejemplo esta entrada ¿cómo puedo cambiar la configuración de red entre pública y privada? El funcionamiento del cortafuegos será distinto si usamos una configuración u otra.

Lo primero es ver qué comando podemos usar para ver la configuración de nuestra conexión. Este sería Get-NetConnectionProfile. Nos devolverá una serie de datos, entre los que aparece una línea que pone Network Category. Ahí nos dirá si la conexión es pública o privada. También nos dará el nombre, Name, del adaptador de red, dato que necesitaremos para conectarlo.

¿Cómo lo cambiamos? Pues de la siguiente forma:

  • Para ponerlo como privado: Set-NetConnectionProfile -Name «ElNombreDeNuestraRed» -NetworkCategory Private
  • Para ponerlo como público: Set-NetConnectionProfile -Name «ElNombreDeNuestraRed» -NetworkCategory Public

Encontrar y matar procesos zombie en Linux

No sólo hay zombies en la ficción, también pululan por tu sistema Linux. Tranquilo, la pantalla de tu portátil no se cerrará de golpe mordiéndote la mano y convirtiéndote en un extra de peli de Romero, se trata de un estado en el que pueden entrar algunos procesos secundarios, que aunque terminan se mantienen en la tabla de procesos hasta que termina el principal, ocupando algo de memoria. No son especialmente problemáticos ni consumen mucho, aunque si un programa deja varios procesos hijo por ahí sueltos puede ser un problema para la RAM.

¿Cómo puedo listar los procesos en estado zombie en mi equipo?

Es sencillo. Usando el comando ps podemos listar todos los procesos presentes en la tabla de procesos. Uno de los valores que tendremos en la salida de ps es el estado del proceso, que será Z para los procesos zombie. Por lo tanto, el siguiente comando listará todos los procesos zombie:

ps aux | grep 'Z'

¿Cómo eliminamos un proceso zombie?

En si no podemos matar un proceso zombie con el comando kill porque ya está muerto, la única opción sería hacerlo a través del proceso padre. Para eso necesitamos saber el pid del padre, por lo que haremos la búsqueda de procesos zombie de está forma:

ps ef | grep 'Z'

La tercera columna de la respuesta tendrá el id del proceso padre de nuestro proceso zombie. Para forzar la eliminación de estos procesos hijo zombificados usamos el siguiente comando:

kill -s SIGCHLD pid_del_proceso_padre

Conocer tu ip externa desde línea de comandos en Linux con wget

Hace tiempo habíamos visto por aquí cómo conocer nuestra IP externa desde línea de comandos en Linux con cURL. Pero hay más métodos. Veamos hoy cómo hacerlo con wget, de nuevo recurriendo a la web ifconfig.me para ello (como en ejemplo de cURL):

wget -qO - ifconfig.me/ip

El API de ifconfig.me además nos permite conocer otras cosas como nuestro user agent, el puerto por el que conectamos, el idioma predefinido con el que navegamos… en la página principal podéis ver, debajo de vuestros datos, todos los comandos disponibles.

Usar PowerShell para exportar los eventos de seguridad de Windows en formato XML

Vamos a seguir hablando de cosillas del PowerShell de Windows y vamos a ver cómo podríamos ver el log de eventos de seguridad de Windows y como podríamos exportarlo a formato XML.

El comando Get-EventLog es, en este caso, el que nos permitirá extraer datos de los logs de eventos de Windows. Para filtrar los eventos de seguridad le pasaremos como parámetro -LogName, con el valor Security. Nos quedaría este comando:

Get-EventLog -LogName Security

Os dejo una captura de la salida del comando (si mi consola os luce un poco rara, podéis ver esta entrada sobre cómo personalizar la apariencia de la misma). Para mi ejemplo he llamado después al comando Select-Object especificando que se muestren solo las primeras 40 filas.

Powershell salida

Bien, con esto tenemos la salida de datos en pantalla, pero lo que queremos es tener los datos en un fichero XML, un fichero al que llamaremos RegistroSeguridad.xml. ¿Cómo lo formatemos? Tenemos dos opciones:

  • Usar el comando Convert-XML y dirigir la salida a un fichero con Out-File
  • Usar el comando Export-Clixml, que en una sola acción hace lo mismo que los dos comandos comentados arriba.

El primer comando sería algo como esto (para no hacer un fichero demasiado descomunal he añadido que solo se cojan los primeros 400):

 Get-EventLog -LogName Security | Select-Object -First 400 | ConverTo-XML | Out-File RegistroSeguridad.xml

El segundo comando sería así:

 Get-EventLog -LogName Security | Select-Object -First 400 |Export-Clixml RegistroSeguridad.xml

¿Por qué es mejor que usemos la segunda opción? Pues porque además de tener una sintaxis más simplicada también obtiene un mejor rendimiento al usar una función que está diseñada específicamente para la conversión y exportación directa, en lugar de llamar a dos (una para conversión y otra para exportación).

Modificando la apariencia de PowerShell

No se a vosotros, pero a mi la apariencia de la interfaz por defecto del PowerShell de Windows no me seduce nada, y estos días tengo que trabajar bastante con él:

Ni la tipografía me resulta cómoda a la hora de leer, ni el color de fondo me convence y hasta me parece demasiado pequeño el tamaño de la consola. Pero podemos personalizar esta interfaz. Basta con hacer click sobre el icono de Powershell que hay en la esquina izquierda de la ventana, al lado del nombre:

Icono sobre el que pulsar

Ahí podéis ir a al menú «Propiedades«. Si no ejecutamos el PowerShell con permisos de administrador los cambios no serán permanentes y se perderán al cerrar la ventana.

La primera pestaña, Opciones, nos permitirá activar o desactivar las opciones de autocompletado, de inserción (pegar en un solo click) o de edición rápida. También nos dejará definir el tamaño del buffer o el del cursor:

La segunda pestaña, Fuente, nos permitirá cambiar la tipografía y su tamaño:

La tercera pestaña, Diseño, nos permite definir el tamaño del buffer, el de la ventana y la posición de la misma:

Y finalmente en la pestaña Colores podremos elegir el color de fondo y de letra para la pantalla de PowerShell y para las pantallas emergentes.

Trasteando un poco lo podemos dejar a nuestro gusto. En mi caso me gusta que parezca una venta clásica de MS-DOS, puede que por nostalgia o por la fuerza del hábito.

¿Cómo forzar que la instrucción «net use /delete» no nos pida confirmación para desmontar una unidad de red?

Vamos con un tip rápido sobre sistemas operativos. Si en Windows queremos desmontar una unidad de red desde un script utilizaremos el comando net use con el parámetro /delete. El problema es que este nos pedirá confirmación, por lo que si es una tarea automatizada se quedará esperando la respuesta ¿Cómo podemos forzar que se desconecte la unidad? Pues con el parámetro /y después del /delete.

La cosa sería más o menos la siguiente:

#Así para desmontar todas
net use * /delete /y

#Cambiando * por el nombre de la unidad 
#desconectamos solo esa
net use x: /delete /y

La opción /y hará que se interprete «yes» como respuesta por defecto a todas las peticiones de confirmación.

Crontab Generator: Generador web de tareas programas para Linux

Si eres de los que ve muy práctico el disponer de un programador de tareas pero no te acabas de sentir cómodo o no acabas de entender cómo se escribe un comando para que cron programe una tarea tienes la suerte de tener un buen montón de herramientas on-line para generar tareas programas en Linux.

Crontab Generator es una de ella, una web donde de forma muy simple elegimos la periodicidad de una tarea, insertamos la ruta del script que la ejecuta y él nos genera el comando. Por ejemplo, supongamos que queremos ejecutar un script que se llama backup.sh,situado en la carpeta home, todos los días de lunes a viernes a las 3 de la madrugada. El comando sería el siguiente:

* 3 * * 1-5 /home/backup.sh

Pero con Crontab Generator tienes un panel donde puedes seleccionar gráficamente estos parámetros:

crontab generator

Probando Bat en Ubuntu: una versión «vitaminada» de Cat

Hoy vamos a hablar de Bat, un clon «vitaminado» del comando Cat de Linux.

¿Por qué usar Bat teniendo ya Cat?

Pues porque, como ya he dicho arriba, se trata de un clon «vitaminado» ¿Qué quiere decir esto? Que aunque funciona igual presenta una serie de añadidos que lo hacen más atractivo o funcional:

  • Tiene resaltado de sintaxis para varios lenguajes de programación.
  • Puedes elegir varios temas de colores para dicho resaltado.
  • Incluye integración con Git para ver los cambios en el fichero.
  • Hace el paginado de forma automática.
  • Permite añadir nuevos temas y sintaxis para otros lenguajes no incluidos.

Aquí puedes ver una captura de cómo va lo del resaltado de sintaxis:

Bat sintaxis

Y aquí podéis ver parte de la lista de temas disponibles:

Listado de temas

Para elegir el lenguaje de programación que queremos resaltar basta con invocar el comando seguido de la opción -l y el nombre del lenguaje:

bat -l Python ejemploPython.py

También tenemos la opción de elegir que en lugar de mostrarnos todo el fichero nos muestre solo un rango de líneas:

bat –line-range 5:53 bin/scripts/isaiah/stryper.sh

¿Cómo instalo Bat?

El código está disponible en GitHub, así que tienes la opción de descargarlo desde la página del proyecto. También puedes ejecutar el comando wget desde la consola en Ubuntu:

wget https://github.com/sharkdp/bat/releases/download/v0.8.0/bat_0.8.0_amd64.deb

sudo dpkg -i bat_0.8.0_amd64.deb

O descargarlo desde los repositorios oficiales en Arch-Linux.

sudo pacman -S bat