Algo de Linux: junio 2015

jueves, 25 de junio de 2015

Debian Jessie con cinnamon

En un post anterior os mostré cómo instalar cinnamon en una Debian Jessie ya instalada. Instalarlo desde el DVD es trivial porque tan sólo tendréis que elegir el escritorio que queréis usar en una lista:
  • Gnome 3.14 
  • KDE 4.11 
  • Xfce 4.10 
  • LXDE 
  • Cinnamon 
  • Mate 
Para máquinas antiguas con recursos muy limitados sería conveniente usar Xfce o LXDE, pero si tenemos un equipo actual con un hardware más o menos reciente y ram, me gusta mucho Debian Jessie con cinnamon. No quiero hacer especificaciones concretas porque todo es muy relativo, pero os puedo decir que en un amd de 64 bits con 2 gb de ram me funciona muy bien. Ahora lo he subido a 8 gb porque necesito ram para trabajar con máquinas virtuales, pero para un uso habitual del escritorio con 2 gb me era más que suficiente.

Os muestro una imagen de mi escritorio con el menú de aplicaciones abierto:


Para los que usamos mucho más el teclado que el ratón, es bastante cómodo abrir el menú pulsando una tecla y comenzar a escribir el nombre de una aplicación para lanzarla inmediatamente pulsando enter.

Además en cinnamon se puede cambiar muy fácilmente el aspecto del escritorio añadiendo extensiones, desklets y applets, algo de agradecer después de lo complicado que nos ha sido hacer esto mismo en Debian Wheezy con gnome-fallback.



Otra cosa que me ha sorprendido gratamente de Debian Jessie ha sido el tiempo de arranque y apagado del sistema operativo, éste último prácticamente instantáneo.

Ahora bien, ¿seguiremos utilizando Debian en educación? ¿O cambiaremos a Ubuntu+Windows como alguien ya ha decidido sin estudiar debidamente el tema y consultarlo con los administradores?
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 18 de junio de 2015

sed: Insertar una línea después de un patrón determinado

En un post anterior mostrábamos un ejemplo en el que insertábamos una línea antes de un patrón determinado en el fichero /etc/rc.local para añadir la llamada a un script que debe ejecutarse en un momento determinado.

En este post, vamos a mostrar como insertar la llamada a un script en el fichero /etc/rc.local después de un patrón determinado:
# sed -i '/# By default this script does nothing./a \/usr\/local\/bin\/ConectaWifi' /etc/rc.local

Si os dáis cuenta, lo que estoy haciendo es insertar la llamada al script utilizando el parámetro /a para insertar justo después del último comentario que viene por defecto en el fichero. Con ésto consigo que la llamada al script se realice antes que cualquier otro script.
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 17 de junio de 2015

Obtener las direcciones MAC de las tarjetas inalámbricas de portátiles usando el inventario de puppet

Vamos a ver un ejemplo de combinación de comandos para obtener las direcciones MAC de las tarjetas inalámbricas de portátiles usando el inventario de puppet y de paso, utilizamos el comando sed como explicamos en el post anterior para quitar las comillas entre las que viene la dirección MAC. 

Para empezar, debemos saber que el servidor puppet guarda un inventario de los facts con un fichero por máquina en el directorio /var/lib/puppet/yaml/facts/.

Si hacéis un ls, podréis comprobarlo:
# ls /var/lib/puppet/yaml/facts/
Con ésto, obtendréis un listado de todos los ficheros de inventario de cada equipo. Los nombres de estos ficheros tendrán la siguiente forma:

nombre.dominio.yaml 

En mi centro tengo nombrados los portátiles de alumnos de la misma manera que nombramos terminales: a01-o01, a01-o02, etc... De este modo, si quiero listar los ficheros de portátiles del aula a01, no tengo más que ejecutar el comando de forma que liste tan sólo los archivos que comienzan por "a01-":
# ls /var/lib/puppet/yaml/facts/a01-*
Bien. Si ahora combinamos nuestro comando con un grep que busque dentro de cada fichero la cadena "macaddress_wlan0":
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0"
Obtendremos un listado con el nombre de cada fichero y la MAC:
a01-o01.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3c:5b"
a01-o02.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:0f"
a01-o03.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:39:2f"
a01-o04.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3e:cb"
a01-o05.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2c:2d"
a01-o06.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2b:e0"
a01-o07.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:43:97"
a01-o08.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1e:4f"
a01-o09.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1c:e2"
a01-o10.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:37:37"
a01-o11.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2b:93"
a01-o12.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:37:b7"
a01-o13.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:9a"
a01-o14.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:38:41"
a01-o15.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:29:6c"
a01-o16.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:21:34"
a01-o17.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:46:69"
a01-o18.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:21:9f"
a01-o19.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:01"
a01-o20.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1e:42"
Como lo que me interesa del listado anterior es quedarme tan sólo con la dirección MAC, puedo hacer lo siguiente:
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0" | awk '{print $3}'
Con lo que me quedaría tan sólo con las direcciones MAC:
"74:2f:68:94:3c:5b"
"74:2f:68:94:3b:0f"
"74:2f:68:94:39:2f"
"74:2f:68:94:3e:cb"
"74:2f:68:94:2c:2d"
"74:2f:68:94:2b:e0"
"74:2f:68:94:43:97"
"74:2f:68:94:1e:4f"
"74:2f:68:94:1c:e2"
"74:2f:68:94:37:37"
"74:2f:68:94:2b:93"
"74:2f:68:94:37:b7"
"74:2f:68:94:3b:9a"
"74:2f:68:94:38:41"
"74:2f:68:94:29:6c"
"74:2f:68:94:21:34"
"74:2f:68:94:46:69"
"74:2f:68:94:21:9f"
"74:2f:68:94:3b:01"
"74:2f:68:94:1e:42"
Si os dáis cuenta, tan sólo hay un pequeño problemilla fácil de resolver: Que las direcciones MAC se encuentran entre comillas. Para quitarlas, tan sólo tenemos que aplicar el comando sed como os mostré en el post anterior:
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0"| awk '{print $3}' | sed 's/^.\|.$//g'
Y listo. Ya tenemos lo que queríamos: El listado de direcciones MAC de los portátiles del aula a01:
74:2f:68:94:3c:5b
74:2f:68:94:3b:0f
74:2f:68:94:39:2f
74:2f:68:94:3e:cb
74:2f:68:94:2c:2d
74:2f:68:94:2b:e0
74:2f:68:94:43:97
74:2f:68:94:1e:4f
74:2f:68:94:1c:e2
74:2f:68:94:37:37
74:2f:68:94:2b:93
74:2f:68:94:37:b7
74:2f:68:94:3b:9a
74:2f:68:94:38:41
74:2f:68:94:29:6c
74:2f:68:94:21:34
74:2f:68:94:46:69
74:2f:68:94:21:9f
74:2f:68:94:3b:01
74:2f:68:94:1e:42
Una vez visto ésto, es muy fácil retocar la combinación de comandos para obtener cualquier otro dato de los equipos.
Publicado por primera vez en http://enavas.blogspot.com.es

sed: Eliminar caracteres al principio y al final de una línea

Supongamos que queremos eliminar el primer caracter de una expresión o cada línea de un archivo, sea cual sea. Podemos hacerlo fácilmente utilizando sed:
sed 's/^.//g'
Ahora bien, si lo que queremos es eliminar el último caracter de una expresión o cada línea de un archivo, utilizaríamos sed de la siguiente manera:
sed 's/.$//g'
Y si lo que queremos es eliminar tanto el primer como el último caracter de cada línea:
sed 's/^.\|.$//g'
Este último caso lo he utilizado para quitar las comillas de uno de los campos de un fichero.
Publicado por primera vez en http://enavas.blogspot.com.es

martes, 16 de junio de 2015

Copiar ficheros de configuración a /etc/skel y replicar en directorios home mediante puppet

Es interesante poder añadir ficheros de configuración para nuevos usuarios mediante puppet en /etc/skel, para que cuando se cree un nuevo usuario, se le apliquen las nuevas configuraciones, pero tan importante como ésto es aplicar también las nuevas configuraciones a los usuarios ya creados.

Del mismo modo que en el post anterior, la parte de añadir ficheros de configuración en /etc/skel es trivial:
file { "/etc/skel/.config/plank/dock1/settings":
       source => "puppet:///puppet-plank-sync-portatiles/settings",
       owner => root, group => root, mode => 644,
}
Lo que no resulta tan trivial es colocar la misma configuración en los directorios home de los usuarios. No obstante, si utilizamos el comando find en un recurso exec y lo relacionamos con el recurso file, la cosa no resulta tan complicada:
file { "/etc/skel/.config/plank/dock1/settings":
       source => "puppet:///puppet-plank-sync-portatiles/settings",
       owner => root, group => root, mode => 644,
       notify => Exec['sincroniza-ajustes-plank-user']
}

exec { 'sincroniza-ajustes-plank-user':
       command => '/usr/bin/find /home/ -type d -path "*.config/plank/dock1" -exec cp /etc/skel/.config/plank/dock1/settings {} \;',
       subscribe => File ['/etc/skel/.config/plank/dock1/settings'],
       refreshonly => true
}
De este modo, estamos colocando el fichero settings en el directorio /etc/skel/.config/plank/dock1, y, siempre que se modifique, lo copiamos a los directorios home de los usuarios.
Publicado por primera vez en http://enavas.blogspot.com.es

Borrar ficheros de /etc/skel y directorios home mediante puppet

En ocasiones, necesitamos borrar un fichero del directorio /etc/skel para que no se añada cuando se cree un nuevo usuario, pero, al mismo tiempo, queremos que ese mismo fichero se borre de los directorios home de los usuarios.

Por ejemplo, supongamos que tengo un lanzador "laptopuserconfig.desktop" que permite lanzar una aplicación de configuración cuando el usuario inicia sesión por primera vez y quiero que se deje de ejecutar ese script de configuración. Lo que tendré que hacer será borrar el lanzador laptopuserconfig.desktop del directorio /etc/skel/.config/autostart/ y de los directorios home de cada usuario que exista en el sistema. 

El borrado del fichero en /etc/skel es sencillo:
file { "/etc/skel/.config/autostart/laptopuserconfig.desktop":
      ensure => absent,
}
Lo más complicado de hacer con puppet, sería borrar el fichero de los directorios home de los usuarios puesto que no sabemos qué usuarios existen en /home. No obstante, si lo pensamos bien, no es tan difícil si recurrimos al comando find y relacionamos bien los recursos file y exec:
file { "/etc/skel/.config/autostart/laptopuserconfig.desktop":
      ensure => absent,
      notify => Exec["remove-laptopuserconfig-homes"]

}

exec { "remove-laptopuserconfig-homes":
        command => "/usr/bin/find /home/ -name 'laptopuserconfig.desktop' -exec rm {} \;",
        onlyif => "test -f /etc/skel/.config/autostart/laptopuserconfig.desktop"
}
Publicado por primera vez en http://enavas.blogspot.com.es

domingo, 7 de junio de 2015

Usuarios de ldap "no pueden" utilizar dispositivos USB

Cuando escribía el post de ayer, me estaba acordando de que alguien me habían comentado que no les funcionaban los dispositivos USB en el Virtualbox que habíamos instalado en Debian. Y, si en lugar de dar por hecho que era un fallo del sistema, me lo hubieran dicho antes, lo habían tenido solucionado en un momento porque era algo muy fácil de resolver.

En Virtualbox, para que un usuario pueda utilizar dispositivos usb, debe pertenecer al grupo local de sistema vboxusers que se crea al instalar Virtualbox.

Como los usuarios iniciaban sesión autentificándose mediante ldap, se les asignaban los grupos de ldap más los grupos especificados en el archivo /etc/security/group.conf. Y, como no se añadían los usuarios al grupo vboxusers, lógicamente, no podían utilizar los dispositivos usb.

La solución era tan sencilla como añadir el grupo vboxusers al archivo /etc/security/group.conf. Por ejemplo, si la regla que permite asignar grupos locales a los usuarios en el fichero anterior es como la siguiente:
*; *; *; Al0000-2400; audio,cdrom,floppy,plugdev,video,lp,lpadmin,netdev,games,fuse
Lo único que tenéis que hacer es añadir vboxusers a esa regla:
*; *; *; Al0000-2400; audio,cdrom,floppy,plugdev,video,lp,lpadmin,netdev,games,fuse,vboxusers
/etc/security/group.conf/et
/etc/security/group.conf

Publicado por primera vez en http://enavas.blogspot.com.es

sábado, 6 de junio de 2015

Agregar usuarios autentificados vía ldap a grupos locales

Cuando los usuarios de nuestros centros hacen login, pertenecen a los grupos a los que hayan sido añadidos en ldap. Y os preguntaréis: ¿Cómo hacemos para que esos usuarios pertenezcan a grupos del equipo local, como por ejemplo, el grupo plugdev (para que el usuario pueda utilizar dispositivos usb) o el grupo cdrom (para que el usuario pueda utilizar el cdrom del equipo)? Muy fácil: Haciendo uso del módulo PAM pam_group.

El módulo PAM pam_group no autentifica al usuario, sino que le otorga la pertenencia a grupos  durante la fase de autentificación. Para utilizar este módulo, añadimos la siguiente línea al fichero /etc/pam.d/common-auth:
auth    optional                        pam_group.so
Y definimos a qué grupos va a pertenecer el usuario que acceda a través de un determinado terminal, en el fichero /etc/security/group.conf.

Este fichero debe estar correctamente formateado y además:
  • Los espacios en blanco son ignorados.
  • Podemos extender la longitud de una línea en la siguiente, añadiendo el símbolo \ al fianl de la misma.
  • Podemos comentar una línea, colocando el símbolo # al principio de la misma.
Cada línea que asigne grupos a los usuarios define una regla que debe tener la siguiente sintaxis:
services;ttys;users;times;groups

Donde:
  • El primer campo (services) es una lista de nombres de servicios PAM a los que queremos aplicar la regla.
  • El segundo campo (ttys) es una lista de nombres de terminales a los que queremos aplicar la regla.
  • El tercer campo (users) es la lista de usuarios o grupos de usuarios a los que aplicar la regla.
  • El cuarto campo (times) se utiliza para indicar cuándo se deben asignar los grupos de la regla al usuario.
  • El quinto campo (groups) está formado por la lista de grupos que queremos asignar al usuario.
Respecto a los campos services, ttys y users, es importante destacar que es posible utilizar un asterisco (*) para representar cualquier servicio, cualquier terminal y/o cualquier usuario.

En cuanto al campo times, tiene un formato determinado por una lista de entradas  con rangos de días/horas, teniendo en cuenta lo siguiente:
  • Los días se especifican con una secuencia de dos caracteres que representan el nombre del día en inglés. Por ejemplo, si queremos indicar lunes, miércoles y viernes, la secuencia sería: MoWeFr.
  • Los días que se pueden representar son: Mo Tu We Th Fr Sa Su Wk Wd Al. 
    • Wk representa los días de la semana de lunes a viernes.
    • Wd representa los días del fin de semana.
    • Al representa los 7 días de la semana.
  • Si se repite un día, el valor se considera inválido.
  • Si especificamos AlFr, estaremos indicando todos los días excepto el viernes.
  • El rango horario se representa en formato de 24 horas separando ambas horas por un guión, indicando el comienzo y el final del período. Ejemplo 0000-2400. Si la hora de finalización es menor que la de comienzo, se tomará como la hora del siguiente día.
El campo groups es la lista de grupos separados por comas o espacios que el usuario adquirirá al aplicar la regla, de manera que el usuario recibirá los grupos si se cumplen las reglas de los campos anteriores.

De este modo, si en vuestro fichero /etc/security/group.conf, tenéis una línea como la siguiente, ya la entenderéis:
*; *; *; Al0000-2400; audio,cdrom,floppy,plugdev,video,lp,lpadmin,netdev,games,fuse
Para cualquier usuario que inicie sesión mediante cualquier servicio PAM en cualquier terminal, se le asignarán los grupos de la lista cualquier día a cualquier hora.
Publicado por primera vez en http://enavas.blogspot.com.es

Mirror de Debian Updates Jessie

Bueno, pues ya que estamos con el tema de los mirrors de Jessie, aprovecho para subir el script que crea el mirror de Debian Updates para Jessie antes de que nadie me lo pida:
#!/bin/bash
#
# Este script crea el mirror de jessie-updates
# Esteban M. Navas Martín 
# 05/06/2015
#
# Si creamos el mirror en el servidor ldap del centro con este script:
#
# Para usar el mirror de jessie en los clientes, ejecutamos en cada cliente:
# echo "deb http://ldap/jessie/debian-updates jessie-updates main contrib non-free" >> /etc/apt/sources.list
#

# Instalamos debmirror si no está instalado aún
dpkg -l|grep "ii  debmirror" || apt-get update && apt-get -y install debmirror

#Debian Jessie Updates
debmirror --debug \
--progress \
--verbose \
--diff=none \
--host=ftp.uk.debian.org \
--root=debian \
--method=http \
--dist=jessie-updates \
--arch=i386,amd64 \
--nosource \
--section=main,contrib,non-free \
--getcontents \
--ignore-release-gpg \
--ignore-missing-release \
--exclude='-dbg_' \
--rsync-extra=none \
/var/www/jessie/debian-updates
https://copy.com/CljKkJY6KjdZi6fH
Publicado por primera vez en http://enavas.blogspot.com.es

Mirror de Debian Security Jessie

Como ya ha habido varios usuarios que me han preguntado, aquí tenéis el script para crear el mirror de Debian Security para Jessie:
#!/bin/bash
#
# Este script crea el mirror de jessie y jessie-backports
# Esteban M. Navas Martín 
# 05/06/2015
#
# Si creamos el mirror en el servidor ldap del centro con este script:
#
# Para usar el mirror de jessie en los clientes, ejecutamos en cada cliente:
# echo "deb http://ldap/jessie/security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list
#

# Instalamos debmirror si no está instalado aún
dpkg -l|grep "ii  debmirror" || apt-get update && apt-get -y install debmirror


## Debian jessie security
debmirror --debug \
--progress \
--verbose \
--diff=none \
--host=security.debian.org \
--root=debian-security \
--method=http \
--dist=jessie/updates \
--arch=i386,amd64 \
--nosource \
--section=main,contrib,non-free \
--getcontents \
--exclude='-dbg_' \
--ignore-release-gpg \
--ignore-missing-release \
--rsync-extra=none \
/var/www/jessie/security
https://copy.com/r4yK6IOXIRvBpTNa
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 3 de junio de 2015

Eliminar la coincidencia de subcadena más larga de una cadena en bash

Como os mostré esta mañana, es muy fácil eliminar la coincidencia de subcadena más corta de una cadena en bash. Puesto que es igual de sencillo, en este post vamos a ver cómo eliminar la subcadena más larga en una cadena.

Para eliminar la coincidencia de subcadena más larga buscando desde el principio de una cadena, utilizaremos la siguiente sintaxis:
${cadena##subcadena}
Así mismo, para eliminar la coindencia de subcadena más larga buscando desde el final de una cadena, utilizaremos lo siguiente:
${cadena%%subcadena}

Siguiendo con el ejemplo del anterior post: Supongamos que tengo una variable con el siguiente valor:
impresora="EPSON-EPL5900-1234"
Y esta variable representa el nombre de la impresora: "EPSON-EPL5900" junto con el número de trabajo en el spool "1234".

Si quisiera quedarme tan sólo con el identificador del trabajo "1234" eliminando "EPSON-EPL5900", podría hacerlo de la siguiente manera:
# echo ${impresora##*-}

1234

Y si lo que quisiera fuera quedarme tan sólo con la marca de la impresora "EPSON" eliminando "EPL5900-1234", podría hacerlo de la siguiente manera:
# echo ${impresora%%-*}

EPSON
Publicado por primera vez en http://enavas.blogspot.com.es

Eliminar la coincidencia de subcadena más corta de una cadena en bash

Cuando utilizamos un signo dólar seguido de un nombre de variable en Bash, el shell sustituye el nombre de la variable por su valor. A esta característica se le llama expansión de parámetros.

La expansión de parámetros, nos permite manipular cadenas. En este post vamos a ver cómo eliminar la subcadena más corta en una cadena.

Para eliminar la coincidencia de subcadena más corta buscando desde el principio de una cadena, utilizaremos lo siguiente:
${cadena#subcadena}
Para eliminar la coindencia de subcadena más corta buscando desde el final de una cadena, utilizaremos lo siguiente:
${cadena%subcadena}

Un ejemplo: Supongamos que tengo una variable con el siguiente valor:
impresora="EPSON-EPL5900-1234"
Y esta variable representa el nombre de la impresora: "EPSON-EPL5900" junto con el número de trabajo en el spool "1234".

Si quisiera quedarme con el valor "EPL5900-1234" eliminando "EPSON", podría hacerlo de la siguiente manera:
# echo ${impresora#*-}

EPL5900-1234

Y si lo que quisiera fuera quedarme tan sólo con el nombre de la impresora "EPL5900-1234" eliminando "EPSON", podría hacerlo de la siguiente manera:
# echo ${impresora%-*}

EPSON-EPL5900
Es algo realmente sencillo y potente a la vez.
Publicado por primera vez en http://enavas.blogspot.com.es

martes, 2 de junio de 2015

Mejor driver para impresoras EPSON EPL-5900 en Debian Wheezy

Desde que cambiamos la versión de Debian de Squeeze a Wheezy, no nos han ido bien las impresoras EPSON EPL-5900 con ninguno de los drivers que hemos probado. 

Esta mañana me preguntaba un compañero qué  driver utilizaba actualmente y si me funcionaba bien. He probado muchos drivers y hasta ahora, el que mejor me ha ido ha sido el siguiente:
Publicado por primera vez en http://enavas.blogspot.com.es

Mirror de Debian Jessie y Jessie-backports

Es realmente simple utilizar como modelo el script que preparé cuando hubo que crear el mirror de Debian Wheezy y Wheezy-backports, para que ahora realice el mirror de Jessie y Jessie-backports.

Tan sólo tenemos que reemplazar wheezy por jessie y listo.

#!/bin/bash
#
# Este script crea el mirror de jessie y jessie-backports
# Esteban M. Navas Martín 
# 18/02/2014
#
# Si creamos el mirror en el servidor ldap del centro con este script:
#
# Para usar el mirror de jessie en los clientes, ejecutamos en cada cliente:
# echo "deb http://ldap/jessie/debian jessie main contrib non-free" >> /etc/apt/sources.list
#
# Para usar el mirmor de jessie-backports en los clientes:
# echo "deb http://ldap/jessie/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list

# Instalamos debmirror si no está instalado aún
dpkg -l|grep "ii  debmirror" || apt-get update && apt-get -y install debmirror


## Debian Jessie y Jessie-Backports
debmirror --debug \
--progress \
--verbose \
--diff=none \
--host=ftp.debian.org \
--root=debian \
--method=http \
--dist=jessie,jessie-backports \
--arch=i386,amd64 \
--nosource \
--section=main,contrib,non-free \
--getcontents \
--exclude='-dbg_' \
--ignore-release-gpg \
--ignore-missing-release \
--rsync-extra=none \
/var/www/jessie/debian

Aquí tenéis el enlace de descarga:
https://copy.com/EMEzu8dYDMMkjz3g

En los comentarios del script podéis ver cómo usar los repositorios creados en el mirror.
Publicado por primera vez en http://enavas.blogspot.com.es