Ejemplo Modulo joomla con control de calendario

En ocasiones requerimos en nuestros sitios datos insertados por los usuarios, afortunadamente Joomla! cuenta con una serie de elementos que hacen mas amena esta tarea, el día de hoy quiero explicar como insertar el calendario de Joomla! tal y como lo vemos en la parte administrativa en las opciones de publicación al editar un articulo.

calendario joomla

calendario joomla

Este articulo ha sido movido a:
http://www.mundosica.com/blog/2013/agregando-el-calendario-de-joomla-a-nuestras-campos-de-formularios/

Paginación de Twitter Bootstrap en WordPress

El twitter Bootstrap entre sus componente que tiene trae incorporado un sistema de paginación con links activos, normales y deshabilitados.

Paginación de twitterBootstrap en WordPress

Resultado Paginación de twitterBootstrap en WordPress

http://twitter.github.com/bootstrap/components.html#pagination

Por otra parte el sistema WordPress suele agregar la paginación de los posts en el archivo loop.php de la plantilla en cuestión, desgraciadamente la función paginate_links nos genera un código html algo diferente a lo que requerimos para adaptarlo al bootstrap.

Salida en HTML necesaria

Salida en HTML necesaria

http://codex.wordpress.org/Function_Reference/paginate_links

Navegando por Internet encontré algunas implementaciones, p.e:

http://panosgalatis.com/2012/08/14/wordrpess-and-twitter-bootstrap-pagination/#.UHvXCqyqyio

Sin embargo incluyen modificaciones al CSS, cuando este renderizado se puede hacer solo con PHP como se muestra continuación:

loop.php

loop.php

Hice un gists en github con el código fuente para que se pueda descargar:

Reloj regresivo en Javascript clockCountdown

En ocasiones es necesario un reloj que cuente de forma regresiva(clockCountdown), por ejemplo si estamos esperando algún evento del cual faltan no sé 5 días(por ejemplo), entonces este reloj podría servir para indicar que faltan 5 días, 0 horas, 0minutos y 0 segundos posteriormente se desincrementaría quedando en 4 días, 23 horas, 59minutos y 59 segundos y así sucesivamente:

Imagen del reloj regresivo

Relog regresivo en acción

Principales características

  • Javascript puro apegado al ECMAScript
  • No depende de ninguna librería(jQuery, mootools, etc…).
  • Soporte de ejecución multiple basada en una pila de objetos.
  • Ligero.
  • Cross Browser.

Visitar proyecto

http://fitorec.github.com/clockCountdown.js/

Generando mapas con raphael.js

mapa_mexico

mapa_mexico

Este es un manual el cual espero tendrá de 4 a 3 artículos, lo empece hace un par de meses pero lo he tenido detenido por mucho tiempo(al igual que mi manual de jquery, el de php y el de inkscape), espero poder dedicarle algo de tiempo y acabar de publicarlo este año, sin mas dejo lo que vendría siendo un borrador de la 1ra sesión.

Cola de archivos del filezilla (queue.xml).

El filezilla es un cliente ftp con varias caracteristicas personalizables interesantes de las cuales guarda bitacolas y archivos de configuraciones para cada usuario de nuestro sistema operativo(ya que funciona en Linux, Mac y Windows). El directorio donde se almacena estos archivos cambia dependiendo del sistema operativo por ejemplo:

#en el caso de linux /home/nombre_usuario/.filezilla/ 
#en el caso de windows C:\Documents and Settings\nombre_usuario\Application Data\FileZilla\queue.xml 
#en el caso de MAC. #No lo se, si alguien lo sabe favor de comentarlo para que lo agregue. 

En mi caso mi maquina que tiene linux y mi usuario es fitorec por lo cual mi directorio es: /home/fitorec/.filezilla/ si revisamos estos archivos veremos la siguiente lista:

/home/fitorec/.filezilla/

 |-- bookmarks.xml <- Marcadores 
 |-- filezilla.xml <- Configuraciones y los datos de la ultima conexión
 |-- filters.xml <- Filtros
 |-- layout.xml <- Interfas grafica
 |-- lockfile <- No lo se,en mi caso estaba vacio.
 |-- queue.xml <- Cola de archivos(este es el que nos interesa por ahora).
 |-- recentservers.xml <- Lista de datos sobre las ultimas conexiones.
 `-- sitemanager.xml 

Estos archivos son muy interesantes y que espero describirlos con
detalles en entradas siguientes, sin embargo en esta entrada describire
las caracteristicas del archivo queue.xml este archivo almacena la cola de archivos que tienen un proceso pendiente(subir/baja el archivo) y que nos muestra el filezilla, como se puede ver en la siguiente imagen:

 

Mas especificamente en la parte inferior de la pantalla del filezilla es donde nos muestra la cola de archivos:

 

Como podemos ver nos muestra la siguiente información:

  • información de la conexión
    • Usuario
    • Servidor
  • Lista de archivos pendientes de los cuales para cada uno muestra informacion:
    • Ruta del archivo local.
    • Dirección si se va a descargar o subir del servidor.
    • Ruta del archivo remoto.
    • Tamaño del archivo.
    • Prioridad.
  • El numero total de archivos en la cola.
  • El tamaño en KB( kilobytes ) de la cola.

Ahora si abrimos el que nos aparece cuando

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<FileZilla3>
 <Queue>
 <Server>
  <Host>nombre_servidor.com</Host>
  <Port>21</Port>
  <Protocol>0</Protocol>
  <Type>0</Type>
  <User>fitorec</User>
  <Pass>contraseñaXXX</Pass>
  <Logontype>1</Logontype>
  <TimezoneOffset>0</TimezoneOffset>
  <PasvMode>MODE_DEFAULT</PasvMode>
  <MaximumMultipleConnections>0</MaximumMultipleConnections>
  <EncodingType>Auto</EncodingType>
  <BypassProxy>0</BypassProxy>
 <File>
  <LocalFile>/home/fitorec/proyecto/proyecto_actual/images/foto1.png</LocalFile>
  <RemoteFile>foto1.png</RemoteFile>
  <RemotePath>1 0 6 images</RemotePath>
  <Download>0</Download>
  <Size>5388</Size>
  <TransferMode>1</TransferMode>
 </File>
 <File>
  <LocalFile>/home/fitorec/proyecto/proyecto_actual/js/script.js</LocalFile>
  <RemoteFile>script.js</RemoteFile>
  <RemotePath>1 0 11 public_html 6 images 2 js</RemotePath>
  <Download>1</Download>
  <Size>2000</Size>
  <TransferMode>1</TransferMode>
 </File>
 </Server>
</Queue>
</FileZilla3> 

Descripción del archivo

Este archivo es un documento en formato xml desgraciadamente no pude
localizar el
dtd (la definción de los datos) que me definiera el contenido, asi que tratare de explicar lo que entendi del mismo:

estructura básica

La estructura basica es la siguiente:

<FileZilla3>
<Queue>
 <Server>
 <File> <!-- documento 1 --> </File>
 <File> <!-- documento 2 --> </File>
 </Server>
 <Server>
  <-- servidor 2 -->
 </Server>
</Queue>
</FileZilla3> 

Como vemos existe un <FileZilla3> el cual contiene una cola
<Queue> que asu vez contiene servidores <Server> los cuales
contiene archivos pendientes en dicha cola <File>.

FileZilla3

Este es el contenedor principal el cual hace referencia a la
definicion de datos para filezilla version 3 el cual acepta multiples
conexiones con servidores por medio de pestañas.

Queque

Es la cola, este es un subcontenedor el cual describe el documento en
si, veran como comentaba el filezilla almacena distinta información la
cual esta dividida en archivos en formato xml cada documento tiene
un nombre que refiere al contenido del documento en este caso el
domento es queque.xml y por lo contiene el elemento </Queue> en el
caso de los marcadores existe bookmarks.xml el cual tiene una
estructura parecida a:

<FileZilla3>
  <Bookmark>
  .... 
 </Bookmark>
 </FileZilla3> 

En el caso de las ultimas conexciones veremos existe el docmento
recentservers.xml el cual tiene una estructura similar a:

<FileZilla3>
 <RecentServers>
  <Server>
   <!-- servidor 1 -->
  </Server>
 </RecentServers>
</FileZilla3> 

Nota: Cuando abrimos nuestro filezilla y abrimos una conexion nueva esta se
almacena automaticamente en el documento recentservers.xml.

Server

Este contenedor almacena informacion del servidor asi como de su
acceso, la información que contiene es, host, puerto, usuario,
contraseña, modo pasivo/activo, códificación, etc.. entre otras.

File

Este se encuentra contenido dentro de un servidor (<Server>) e indica un
documento, un ejemplo es el siguiente:

<File>
 <LocalFile>/home/fitorec/proyecto/proyecto_actual/js/script.js</LocalFile>
 <RemoteFile>script.js</RemoteFile>
 <RemotePath>1 0 11 public_html 6 images 2 js</RemotePath>
 <Download>1</Download>
 <Size>2000</Size>
 <TransferMode>1</TransferMode>
</File> 

LocalFile: archivo local (en
nuestra maquina).
RemoteFile : nombre remoto(en el servidor).
RemotePath: directorio remoto.
Download: sentido (descargar=1 ó subir=0).
Size Tamaño de la trasferencia.

Se me ocurren varias ideas como alterar este documento de la cola
archivos del filezilla, a partir de los cambios en un
directorio que tenga un control de versiones(git,mercurial ó svn).

De esta forma al abrir el filezilla estaria listo para realizar la
trasferencia indicada.

  

Como instalar un repositorio privado y remoto con git en servidor con ssh + clientes linux

Como instalar un repositorio remoto con git en servidor + clientes linux

instalando_git_servidor en linux

instalando git servidor en linux

La siguiente configuración fue probada en debian lenny como servidor y ubuntu , trisquel 4.5 como maquinas clientes.

Nota1:

Para otras distribuciones de Linux se recomienda adaptar los pasos a las variantes y caracteristicas de la configuración de git especificas de nuestra distribución.

Nota2:

Se entiende que el lector tiene conocimientos básicos de linux y su interacción con con el CLI, conexiones ssh, claves publicas y privadas.

Previo y Configuración del servidor

El Git al ser un sistema manejador de versiones distribuido y no centralizado(como subversión), lo único necesario antes de empezar es: tener git en el servidor y en las máquinas clientes.

Por cuestión de seguridad y facilidad de la administración cuando existen múltiples desarrolladores, lo que se recomienda es crear un usuario git en el S.O. y apuntar sus archivos(que seran capetas de proyectos) a la carpeta de opciones /opt/ y su interprete hacia el interprete proporcionado por git.

adduser #introducimos los datos que nos pide 

Editamos el registro del usuario git el archivo /etc/passwd quedan la configuración algo como:

git:x:1000:1000::/home/git:/usr/bin/git-shellgit:x:1000:1000::/home/git:/usr/bin/git-shell 

Para concluir con la configuración del servidor hay que darle al usuario git permisos para escritura en el directorio /opt/ y debemos también agregar un usuario administrador que sera el que pueda crear nuevos proyectos, al que llamaremos(usuario_admin) .

Agregando nuevo proyecto

Una vez esto, desde alguna máquina cliente creamos una carpeta de nuestro nuevo repositorio:

mkdir miApp
cd miApp git init 

Partiendo del concepto que el git es un sistema distribuido y que la carpea.git en el servidor es en esencia nuestra carpeta .git( con pequeñas diferencias ), nos podemos enviar los archivos de nuestra carpeta .git a nuestro servidor(olvidándonos de cosas como git clone —bare mi_proyecto.git):

scp -rp .git usuario_admin@miDominio.net://opt/mi_proyecto.git 

Ojo: no podremos utilizar el usuario git ya que por seguridad el shell-git desactiva las conexiones ssh p.e.

ssh git@miDominio.net PTY allocation request failed on channel 0 fatal: unrecognized command 'gitosis-serve schacon@quaternion' Connection to gitserver closed. 

agreando brazo origin y finalizando la configuración

Ahora desde la misma máquina cliente podemos añadir el branch origin:

git remote add origin ssh://git@miDominio.net/opt/mi_proyecto.git 

Nota: observe que el brazo se agrego hacia el usuario git.

Listo lo ultimo es probar que todo funcione:

touch README git add README git commit -m "message for change log" git push -u origin master 

Descargando el proyecto.

Los usuarios que tengan el acceso del usuario git podran integrarse al proyecto como:

git clone ssh://git@miDominio.net/opt/mi_proyecto.git 

Y listo!..

Fuentes:

Como Joomla genera sus passwords

Hace un par de días realice un posts en donde unifico el sistema de autenticación de Joomla con otro sistema en PHP (ver posts), mientras realizaba y estudiaba el código del Joomla, note algunas cosas que aqui dejo para que no se me olviden y por a alguien más le sirve.

Joomla Divide el campo password en 2 partes.

Algo que caracteriza a joomla es que el campo password en 2 partes de forma encrypt’:'salt la segunda parte(salt) es una cadena generada de forma (seudo) aleatoria y es empleada en conjunto con una función dominante de la derivación (KDF) y la contraseña del usuario para generar  la primera parte encrypt como se muestra en la siguiente imagen.

Como joomla trata los passwords

Figura 1 . -Como joomla trata los passwords

Como se puede ver el password finalmente es la concatenación de la cadena salt y encrypt con el carácter ‘:‘ . El empleo de esta cadena salt es típica en los sistemas de cifrado y en seguridad informática la obtención de esta cadena salt un gran paso para la obtención de la contraseña(con un Dic. y FB).

Joomla emplea MD5 como mecanismo de cifrado.

Joomla al igual que la mayoría de los sistmas Web  cifra sus contraseñas con algún algoritmo de cifrado irreversible, Joomla emplea MD5 (al menos que se configure de forma contrario) , en la figura se ve como la cadena salt es obtenida mediante la función getSalt() dicha función se encuentra definida en las librerías del Joomla en la versión 1.5-1.6 se encuentra en:  JOOMLA1.6/libraries/joomla/user/helper.php (Descargar Joomla y cerciorarse )cuando es llamada con los parámetros por defecto lo que nos genera es:

$salt    = md5(mt_rand());

Como podemos observar emplea la función mt_rand, la cual nos devuelve un número pseudo aleatorio haciendo uso de la implementación de algoritmo Mersenne twister, esto es bueno ya que genera los números es un poco mas eficiente tanto en tiempo de ejecución como en el echo en que te garantiza que es el número generado es mas seudo aleatorio que el que se genera con el rand() que es como lo implementa típicamente lenguajes como C.

Por otra parte para obtener la cadena encrypt hace uso de la cadena salt generada previamente con los parametros por defecto toma el comportamiento como:

$crypt = md5($password.$salt);

Finalmente si quisiéramos hacer un sistema en donde se puedan registrar usuarios desde otra aplicación tendríamos que generar este comportamiento en nuestra aplicación, dejo aquí la función password que recibe una contraseña sin cifrar(tal como la recibe un formulario) y devuelve la contraseña como típicamente la generaría el joomla antes de guardar en su BD.

#genera un password en el formato como lo hace el joomla
#la El password lo genera en 2 partes P1:P2
#P1 Es el resultado del md5 de concatenación del password con P2
#P2 Es la cadena security salt generada con md5
#
#para mayor info respecto la cadena salt revisar la función getSalt
#definida en: JOOMLA1.6/libraries/joomla/user/helper.php
function password($password){
	$salt	= md5(mt_rand());
	$encrypt = md5($password.$salt);
	return $encrypt.':'.$salt;
}

#prueba con la contraseña admin
echo password('admin')."\n";

Código fuente disponible en:  http://gist.github.com/596732

No se recomienda tener más de un sistema de registro en un sistema ya que la duplicidad de funciones genera ambigüedades y por lo consiguiente inconsistencias (DIE), es por esto que si sólo la recomiendo en caso que bloquees los registros desde tu joomla.

Poniendo a prueba el sistema de generación de passwords.

Como se menciono previamente es una de las características del Joomla que genere una cadena salt por cada password, la pregunta seria ¿que tantan seguridad le brinda al sistema esta metodología de generación de passwords? y si ¿en lugar de md5 cambio la configuración por defecto para ocupar  otro mecanismo como sha1?.

Si cambiamos la función hash de md5 a sha1 para este mecanismo en lo personal considero que no mejora mucho ya que la cadena salt quedaría definida como sha1(mt_rand()) .A pesar que sha1 genera una cadena de 160bits a diferencia de md5 que genera una de 128bits ambas generarían la cadena hash del resultado obtenido por mt_rand(), algo análogo pasa con la cadena encrypt la cual seria  la cadena hash de la contraseña(en texto plano) concatenada con la cadena salt, algo similar a sh1(‘Contraseña’.$salt).

Por otra parte si observamos lo que cambia es que con md5 generamos 2 cadenas de 32 caracteres y el password final queda con 65caracteres  y con sha1 generamos 2 cadenas de 40 caracteres generando un password de 81caracteres, lo cual es un poco peligroso ya que si alguien llega a obtener el campo password de un usuario joomla automáticamente obtiene la cadena salt y encrypt y  al revisar la longitud de dichos campos sabe cual fue la funcion hash empleada para obtener la cadena crypt.

Por lo tanto la vulnerabilidad Seguridad de un campo password en joomla se encuentra delimitada por la prediccion de algoritmo Mersenne twister o de su implementacion en PHP mt_rand() , de los diccionarios disponibles para funciones hash (por ahí vi un Blog, vi un elegante  bot  que empleaba un diccionario cifrar MD5) y como siempre de la contraseña en texto plano de los usuarios….

Instalar openOffice en español en ubuntu 10.04 , 9.10

En muchas ocasiones nos damos cuenta que nuestro openOffice no reconoce bien la idioma en español dejo aqui un script que soluciona este problema, espero les sea útil:

Código disponible en: http://gist.github.com/462545

#!/bin/bash
#Descripción: instala(ubuntu 9.10 y 10.4) openoffice en español
#Autor: fitorec
#Nota: requiere permisos de super usuario

if [ `id -g` -ne 0 ]
then
  echo "Este script requiere permisos de super usuario"
  exit 1
fi

#agregando un nuevo reposultorio
add-apt-repository ppa:openoffice-pkgs/ppa
#Sincronizando la nueva lista de paquetes
apt-get update
#instalando las versiones mas nuevas de paquetes encontrados(activar para actualizar paquetes)
#apt-get --force-yes -y upgrade
#en sistemas gnome
apt-get --force-yes -y build-dep openoffice.org-gnome
apt-get --force-yes -y install openoffice.org-gnome

#poniendo los paquetes en español
apt-get --force-yes -y build-dep openoffice.org-help-es
apt-get --force-yes -y install openoffice.org-help-es

#poniendo los paquetes en español
apt-get --force-yes -y build-dep openoffice.org-l10n-es
apt-get --force-yes -y install openoffice.org-l10n-es

#Finalmente eliminamos paquetes innecesarios en nuestro sistema
apt-get autoremove

espero sus comentarios…

Cambiando de Direccion Mac dinamicamente en Linux.

Las direcciones MAC(control de acceso al medio, por sus siglas en inglés “Media Access Control”) es una dirección de 48bits la cual sirve como identificador único para cada dispositivo de red(mas info http://es.wikipedia.org/wiki/Direcci%C3%B3n_MAC). En algunas ocasiones los administradores de red restringen determinados servicios(p.e. el Internet)  teniendo como único parámetro esta dirección.

En el momento que los dispositivos se conectan a una red propagan su dirección MAC, en sistemas operativos como Linux y Unix es fácil hacer que nuestro equipo propaguen/escuchen otra dirección, especialmente el comando ifconfig nos permite visualizar y configurar los parametros de nuestras interfaces de red p.e. para visualizar las configuración de nuestras interfaces:

#visualizando la información de nuestros dispositivos

ifconfig

#nos deberia aparecer algo similar a.

eth0      Link encap:Ethernet  direcciónHW 00:2b:d1:1a:3f:25
ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
Interrupción:20 Dirección base: 0xa000

lo        Link encap:Bucle local
Direc. inet:127.0.0.1  Másc:255.0.0.0
Dirección inet6: ::1/128 Alcance:Anfitrión
ACTIVO BUCLE FUNCIONANDO  MTU:16436  Métrica:1
Paquetes RX:140 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:140 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:0
Bytes RX:75659 (75.6 KB)  TX bytes:75659 (75.6 KB)

wlan0     Link encap:Ethernet  direcciónHW 00:d3:e1:cb:75:98
Direc. inet:192.168.1.47  Difus.:255.255.255.255  Másc:255.255.255.0
Dirección inet6: fe80::216:e3ff:fe6b:8588/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
Paquetes RX:131087 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:91988 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:136309413 (136.3 MB)  TX bytes:11742724 (11.7 MB)

#si deseamos ver la configuración de la interface eth0

ifconfig eth0

#el cual nos deberia mostrar algo similar a

eth0      Link encap:Ethernet  direcciónHW 00:2b:d1:1a:cf:98
ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
Interrupción:20 Dirección base: 0xa000

Como podemos ver nos aparece un parámetro el cual se denomina direcciónHW que refiere a la dirección de hardware o MAC. Para modificar la dirección lo primero que se requiere es tener permisos de administrador en el sistema(root) y ejecutar las siguiente sentencia:

#formato de sentencia
ifconfig [INTERFACE] hw ether [MAC]

#Si quisiéramos asignarle la direccion 00:2b:d1:1a:3f:25 a la interface eth0 la sentencia seria
ifconfig eth0 hw ether 00:2b:d1:1a:3f:25

Existe un comando denominado macchanger el cual nos realiza esta tarea la cual nos ayuda si p.e. nuestra MAC esta en una lista negra entonces con el macchanger podemos cambiar nuestra dirección por cualquier otra(incluso tiene un parámetro para hacerlo de forma aleatoria) si embargo, si podemos acceder a la red pero no tenemos determinado servicio entonces lo que podemos hacer es preguntarle a los demas hosts cual es su dirección MAC pues seguramente a alguna de ellas le brindan el servicio.

Para hacer esto lo se requiere de mapear la la red para esto el programa que recomiendo es el nmap(se puede con mucho otros como ettercap) esto lo hariamos con la sig intruccion.

#las siguientes instrucción se deberán ejecutar en modo super usuario.
#Supongamos que pertenecemos a la red 192.168.1.0 con la mascara de red
# 255.255.255.0 o bien 24 bits activados
# esto es Binario(11111111)=decimal(255)  8bits+8bits+8bits+0bits=24bits

#revisamos por los hots activos toda la red 192.168.1.0/24
nmap -sP 192.168.1.0/24

#Nota: con ettercap basta con hacer
ettercap -C
#nos aparecerá una interface bastante intuitiva.

Ahora si tenemos una lista de MAC validas para determinado servicio es posible identificarnos en el sistema como usuarios validos, esto siempre y cuando la MAC este disponible en la red(es decir el equipo propietario de dicha interface).

Fue cuando me puse a pensar en una solucion para este problema y se me ocurrio hacer un script que haga lo siguiente.

Nota: suponemos que que ya estamos conectados a la red(por que esa es otra historia) ya tenemos la lista de MACs validas.

1.- Escuchamos los equipos y sus MAC conectados a la red.

2.- De la lista de MACs validas seleccionamos una de forma aleatoria.

2.1. Si el equipo propietario de dicha MAC esta activo: Regresamos al paso (2)

2.2. Si no es asi: Asignamos la MAC al nuestro dispositivo y concluye el programa.

Nota: El script requiere que se tenga instalado el programa para mapeo de puertos ‘nmap’ en el sistema.

Como un detalle del código podemos ver como se puede cachar la MAC de un dispositivo a través de un grep y una expresión regular como se muestra en  la siguiente sentencia:

#mostrando la MAC de la interface eth0
ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

#mostrando la MAC de la interface wlan0
ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

#lo cual es muy util para procesar a la hora de hacer un script p.e. en Bash
MyMAC=`ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'`
#ahora que en MyMAC tenemos la MAC de wlan0 podemos utilizar dicha variable
echo $MyMAC

A los administradores de red espero les sea útil y utilicen otras métricas(no solo la MAC)  para restringir los accesos a determinados servicios.