Servicios Express Global Eagle


Patrocinado por "Servicios Express Global Eagle"

Visíte nuestra Web Patrocinadora para contrataciones de servicios Empresariales AAA

lunes, 19 de enero de 2015

Listar todos los paquetes instalados desde un repositorio específico en Debian

En Debian y derivados, normalmente se utiliza el comando dpkg -l | grep '^ii' para listar los paquetes instalados. Aunque la salida de este comando no contiene información acerca de qué repositorio proviene cada paquete. La herramienta apt-cache provee dicha información, pero no permite listar paquetes por repositorio, por lo tanto sólo es posible filtrar manualmente.

Veamos un ejemplo en un sistema Debian 6:

root@debian6:~# cat /etc/issue Debian GNU/Linux 6.0 \n \l

Cuando se me planteó esta necesidad, la primera opción que probé fue utilizar la herramienta dpkg-query, la cual, según su página de manual, posee la opción -Wpara listar todos los paquetes (cuando no se especifica ningún patrón), y la opción -f para formatear su salida:

root@debian6:~# man dpkg-query -W, --show package-name-pattern... Just like the --list option this will list all packages match- ing the given pattern. However the output can be customized using the --showformat option. The default output format gives one line per matching package, each line having the name and installed version of the package, separated by a tab. -f, --showformat=format This option is used to specify the format of the output --show will produce. The format is a string that will be output for each package listed.

Y entre las opciones de formato es posible obtener el origen (repositorio) de cada paquete:

Maintainer Origin Package

Lamentablemente descubrí que, a pesar de que se dispone de esta opción, no existe la información:

root@debian6:~# dpkg-query -W -f='${Package} ${Origin}\n' | head acpi acpi-support-base acpid adduser aide aide-common apache2 apache2-mpm-worker apache2-threaded-dev apache2-utils

En cambio sí existe para otros campos:

root@debian6:~# dpkg-query -W -f='${Package} ${Maintainer}\n' | head acpi Debian Acpi Team <pkg-acpi-devel@lists.alioth.debian.org> acpi-support-base Debian Acpi Team <pkg-acpi-devel@lists.alioth.debian.org> acpid Debian Acpi Team <pkg-acpi-devel@lists.alioth.debian.org> adduser Debian Adduser Developers <adduser-devel@lists.alioth.debian.org> aide Aide Maintainers <pkg-aide-maintainers@lists.alioth.debian.org> aide-common Aide Maintainers <pkg-aide-maintainers@lists.alioth.debian.org> apache2 Debian Apache Maintainers <debian-apache@lists.debian.org> apache2-mpm-worker Debian Apache Maintainers <debian-apache@lists.debian.org> apache2-threaded-dev Debian Apache Maintainers <debian-apache@lists.debian.org> apache2-utils Debian Apache Maintainers <debian-apache@lists.debian.org>

Por lo tanto debí probar otra solución: obtener el listado de todos los paquetes instalados y ejecutar apt-cache showsobre cada uno, para luego filtrar por repositorio. Por ejemplo, si quisiera determinar qué paquetes han sido instalados desde el repositorio "lts" simplemente debo ejecutar:

root@debian6:~# for p in $(dpkg -l | grep '^ii' | cut -d ' ' -f 3); do apt-cache showpkg $p | head -3 | grep -v '^Versions' | sed -e 's/Package: //;' | paste - - ; done | grep lts | awk -F '\t' '{print $1}' | head acpi-support-base apache2 apache2-mpm-worker apache2-threaded-dev apache2-utils apache2.2-bin apache2.2-common apt apt-utils bash

En el sistema en cuestión, 34 paquetes (instalados) provienen del repositorio "backports":

root@debian6:~# for p in $(dpkg -l | grep '^ii' | cut -d ' ' -f 3); do apt-cache showpkg $p | head -3 | grep -v '^Versions' | sed -e 's/Package: //;' | paste - - ; done | grep backports | wc -l 34

¿Qué hace éste comando?

for p in $(dpkg -l | grep '^ii' | cut -d ' ' -f 3); do apt-cache showpkg $p | head -3 | grep -v '^Versions' | sed -e 's/Package: //;' | paste - - ; done | grep lts | awk -F '\t' '{print $1}'

Primero obtiene un listado de todos los paquetes instalados quedándose sólo con el nombre del paquete: dpkg -l | grep '^ii' | cut -d ' ' -f 3

Luego, para cada uno (for p in $), obtiene su información detallada: apt-cache showpkg $p

En la salida de apt-cache showpkg, la primera línea es el nombre del paquete y de la tercera se puede deducir el origen. Por ende, se obtienen sólo las primeras 3 líneas (head -3), se elimina la segunda línea (grep -v '^Versions'), se elimina la cadena "Package: " de la primera línea (sed -e 's/Package: //;'), y se concatenan ambas líneas (paste - -).

Hasta aquí se obtiene un listado donde cada línea posee el nombre del paquete y su origen. Sólo resta filtrar de acuerdo al repositorio deseado, por ejemplo "lts" (grep lts), "backports", "updates", etc. Luego es posible quedarse sólo con los nombres de paquete (awk -F '\t' '{print $1}') o con el total (wc -l).

De esta forma fui capaz de identificar qué paquetes fueron instalados desde el repositorio "lts".

Espero que les sirva.

Determinar cuándo fue instalado un sistema operativo *nix

Necesitaba saber con exactitud cuándo fue instalado un servidor. Simplemente tenía curiosidad, aunque podría haber necesitado tal información para un fin más importante, como por ejemplo un análisis forense. Lo primero que se me ocurrió es consultar los logs de instalación y las fechas de creación de los mismos. Aunque al tratarse de simples archivos, esta información puede ser fácilmente modificable. Por ello se me ocurrió consultar directamente la fecha de creación del sistema de archivos raíz.

ext 2/3/4 (GNU/Linux)

Para consultar la fecha de creación del filesystem raíz (/) antes es necesario saber en qué dispositivo se encuentra:

root@ubuntuserver:~# mount | grep "on / " /dev/sda2 on / type ext3 (rw,errors=remount-ro)

Luego, es posible determinar la fecha de creación de sistemas de archivos ext2/3/4 utilizando la herramienta tune2fs:

root@ubuntuserver:~# tune2fs -l /dev/sda2 | grep "created" Filesystem created: Fri Apr 1 17:12:46 2011

Este servidor en particular fue instalado el 1 de abril de 2011 a las 17:12.

UFS o ZFS (FreeBSD)

En FreeBSD es posible lograr un resultado similar consultando la fecha de creación del directorio / (ya que su creación es producto del formato, sea UFS o ZFS):

root@hal9000:~ # stat -f "%SB" / Nov 11 18:03:46 2014

En este ejemplo utilizo la herramienta stat para obtener información estadística del archivo /. La opción -fespecifica el formato de la salida, donde el % indica el campo que se desea obtener, el cual es B (birth time) en formato de fecha (string).

Este sistema FreeBSD fue instalado el 11 de noviembre de 2014 a las 18:03.

Lógicamente, estamos suponiendo que la hora era correcta durante la instalación, y que el sistema de archivos raíz nunca fue formateado luego de la misma.

jueves, 1 de enero de 2015

Feliz 2015!!

Feliz 2015 a todos mis amigos, clientes, seres queridos, compañeros de trabajo y socios de negocio todas las cosas buenas y bendiciones.