Repositorios Debian squeeze LTS

Desde ya hace un tiempo se venía rumoreando y finalmente se hizo realidad: Debian 6.0 [squeeze] será la primera Debian con soporte LTS. Tras este anuncio por parte de la comunidad, era de esperar algún tipo de cambio o modificación y estos no se hicieron esperar.
Por un lado han creado una nueva lista oficial para brindar el soporte que se merece esta LTS. Te puedes suscribir a ella desde aquí.
Y por otro lado, quizás el cambio más importante de momento, es que se ha creado un nuevo repositorio para los paquetes LTS. Así que si empleas Debian squeeze y pretendes aprovechar este largo tiempo de soporte es hora de que edites tu fichero de repositorios y pongas el siguiente para binarios,
deb http://http.debian.net/debian squeeze-lts main contrib non-free
Y este otro si también deseas tener el código fuente de los paquetes,
deb-src http://http.debian.net/debian squeeze-lts main contrib non-free
Por cierto, Debian squeeze LTS tendrá soporte hasta el 6 de Febrero 2016.
Leer más

If corto en python

Hoy es uno de esos días en los que estoy programando y me interesa simplificar el código, pero necesito igualmente condicionales. Desde la época de C, una de las formas de realizar asignaciones condicionales sencillas era con un 'if corto', o lo que es lo mismo, pasar de algo tal que esto,
...
country = ''
if(lang == 'es') {
    country = 'ES'
} else {
    country = 'EN'
}
...
A algo como esto,
...
country = (lang == 'es' ? 'ES' : 'EN')
...
Este tipo de sentencias se aplican en muchos, por no decir todo tipo de lenguajes de programación, no sólo C. Por ejemplo en PHP,
...
$value = ($userid == $user['userid'] ? 'yes' : null);
...
Sin embargo, cuando quiero aplicar esta misma fórmula en Python, no me funciona. Esto no significa que Python no tenga un 'if acortado', sino que lo implementó de otra forma,
...
host = {
   'name': (tmp['dns'] if tmp.has_key('dns') else tmp['name'])
}
...
Como podéis observar en vez de usar el tradicional (a==B ? x : y), lo que hace es la asignación y luego al comprobación: (x if a==b else y) y suprime a la vez los operadores reducidos ? y :
Tenerlo presente si vais a programar en Python ;-)
Leer más

SEO, a nivel teórico

Hacía tiempo que no escribía nada sobre SEO, y este fin de semana, tras una más que interesante lectura sobre técnicas SEO y de mejora de posicionamiento Web, voy a escribir una pequeña entrada acerca de ello. Nada a nivel práctico, como las entradas de mejora de posicionamiento web en Blogger [1] y [2], sino temas teóricos.
A día de hoy, tener una página en la red y que te encuentren por nombre es imposible y mucho menos tener un flujo de visitas constante. La gente que va a consumir tu información es, en la mayoría de los casos, gente que llega a tu URL a través de enlaces en los buscadores, que son los grandes protagonistas en la estructura World Wide Web actual. Por lo tanto, a nivel de negocio como de blog, es importante estar bien posicionado si pretendes que se lea lo que escribes. Para conseguirlo existen dos formas básicas:
  1. SEO (Search Engine Optimization)
    Es el posicionamiento natural, en base a la información que ofreces. No se paga por estar, sino que se está por contenidos.
  2. SEM (Search Engine Marketing)
    Son campañas de pago por enlaces o mejoras de posicionamiento mientras pagues. Pagas por salir en la primera página, no importa tu calidad o tus contenidos.
Sobre el segundo método de posicionamiento poco hay que decir o explicar. Pasas por caja y sales como anuncio en la primera página. Vamos a dedicar un poco de espacio por lo tanto a explicar el primer método: Las técnicas SEO. Éstas se basan en 4 principios básicos:
  1. Indexación
    Quizás es la parte más importante de estas técnicas, ya que es necesario comprender cómo funcionan los buscadores para adaptar la estructura de tu página a ellos. Cuanto más facilites la información al indexador, mejor le vas a caer, más fácil le será encontrar la información y más escalarás.
    Por supuesto, cada buscador es un mundo y lo que es bueno para Google, no tiene por que serlo para Bing. Aunque es cierto, que todos intentan más o menos buscar lo mismo.
  2. Relevancia
    Son las palabras sobre las que queremos y tenemos que hacer hincapié y darle más fuerza en nuestra página. Por decirlo de alguna forma, buscar y dar palabras clave al buscador es como ofrecer un criterio de búsqueda con técnicas SEM, pero sin pasar por caja.
    En cada página hay que establecer 3 o 4 palabras importantes y hacer que destaquen. No todo el texto puede ser importante, de ahí que haya que darle fuerza a aquellas palabras por las que nos interesa que nos busquen, para que salgamos.
  3. Popularidad
    Simplemente, enlaces externos.
    No es fácil conseguir que un sitio sea popular, pero es un trabajo del día a día. Es importante tener enlaces externos, pero enlaces de verdad, no enlaces en granjas de links.
    Los enlaces de verdad se consiguen con calidad de contenidos.
  4. Honradez
    Ser honrado, en lo que escribes, al igual que en la vida y te verás recompensado. Procura no engañar al indexador, pues cuando se de cuenta, te penalizará. Intenta crear contenido de calidad, no copies. Y sobre todo, ten presente que lo que hoy es bueno, mañana puede no serlo.
Después de tener claros los 4 principios básicos, queda constancia de que conseguir un buen SEO no es algo sencillo ni que se haga de la noche a la mañana. Existen técnicas, como el tema de las keywords para páginas, pero la popularidad y mantenerse ahí arriba con un buen Page Rank cuesta muchas horas de dedicación. Así que no os desesperéis y acordaros que invertir en calidad nunca está demás.
Leer más

Instalación de paquetes en GNU/Linux

Por suerte, desde hace ya muchos años instalar o desinstalar paquetes en los diferentes sistemas operativos de base Linux se hizo mucho más sencillo. Al principio de los tiempos, instalar algo era casi para "nativos del código fuente". Aun recuerdo la época en la que había que compilar los binarios con todas sus dependencias. Conseguías más rendimiento, puede ser, si sabías lo que hacías, pero actualizar un paquete era casi misión imposible. El trabajo casi nunca compensaba el esfuerzo.
Por suerte, el mundo Linux avanzó y las principales distribuciones tienen desde hace mucho tiempo repositorios en los que ofrecen software ya compilado y empaquetado. Así, instalar o actualizar un paquete es una tarea muy sencilla. Pero por supuesto, cada distribución, optó por un método diferente y para nada homogéneo, ni de paquetes ni de instrucciones para la instalación.
A continuación os dejo aquí una tabla comparativa de los comandos que cada distribución tiene para hacer la misma tarea. En todos los casos, los paquetes a instalar vienen de los repositorios que estén configurados en cada uno de los sistemas.
Linux OS
search
install
update
remove
Debian
Ubuntu
Linux Mint
apt-cache search [pkg] apt-get install [pkg] apt-get upgrade apt-get remove [pkg]
Fedora
Red Hat
CentOS
yum search [pkg] yum install [pkg] yum update yum remove [pkg]
Mandriva
Mageia
urpmi -y [pkg] urpmi [pkg] urpmi-auto-select urpme [pkg]
OpenSuse zypper search [pkg] zypper install [pkg] zypper update zypper remove [pkg]
Arch pacman -Ss [pkg] pacman -S [pkg] pacman -Syu pacman -R [pkg]
Gentoo emerge -s [pkg] emerge [pkg] emerge -uD [pkg] emerge -C [pkg]
Es muy recomendable tener presente esta chuleta de ayuda siempre que tengáis que manejar más de un sistema de base Linux de una familia diferente.
Leer más

Valores aleatorios en #bash

Recientemente descubrí una interesante variable bash, $RANDOM, que como muy bien su nombre indica, devuelve un número aleatorio entre 0 y 32767 cada vez que es llamada. Un ejemplo visual resulta más sencillo,
shell> echo $RANDOM
3721
Por supuesto, este número no es que nos sirva de mucho, ya que tomar decisiones en función de él es un poco complicado. Para hacerlo más útil, vamos a aplicarle el módulo, para que el valor devuelvo nos sirva ya de algo.
Por ejemplo, aplicando el módulo 2, tendremos una salida entre 0 y 1, por lo que nos serviría en un script para que se ejecute, según estadística, la mitad de las veces.
shell> echo $((RANDOM%2))
1
shell> echo $((RANDOM%2))
0
El módulo lo podemos aplicar sobre cualquier número, según el resultado que no interese.
Para ver que el ejemplo es más o menos real, nos fijamos en la siguiente salida,
shell> for i in {1..10000} ; do echo "$((RANDOM%2))"; done | sort | uniq -c
   4992 0
   5008 1
Si os interesan valores aleatorios en bash, $RANDOM es vuestra variable.
Leer más

Contando ocurrencias de una palabra

A cuántos de nosotros se nos habrá preguntado alguna vez, "¿cuántas veces se repite X comando en un fichero". Pues bien, la forma más simple de hacerlo, sin duda es con un sort y con un uniq, ambos comandos básicos presentes en cualquier sistema GNU/Linux. Vamos a ver un ejemplo de cómo usarlos juntos para que nos den las respuestas que precisamos.
Imaginémonos que nos interesa saber la shell que están empleando los usuarios de uno de nuestros sistemas. La forma más sencilla de averiguar esto es leyendo el fichero /etc/passwd, coger la última columna (si tenemos en cuenta una separación por ":") y luego contar las ocurrencias de cada una. Algo tal que esto,
shell> awk 'BEGIN{FS=":"} {print $7}' < /etc/passwd
/bin/bash
/bin/sh
/bin/sh
/bin/sh
/bin/sync
/bin/sh
...
Ya si nos interesa ser un poco más profesionales, podemos ordenarlas.
shell> awk 'BEGIN{FS=":"} {print $7}' < /etc/passwd | sort 
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/sh
/bin/sh
...
Pero imagínate que tienes 200 usuarios datos de alta, ir línea a línea contando podría hacerse eterno. Eso y que terminaríamos por perdernos. Así que la mejor idea es dejar una único ocurrencia y que sea el propio comando uniq el que las cuente,
shell> awk 'BEGIN{FS=":"} {print $7}' < /etc/passwd | sort | uniq -c 
 2 /bin/bash
 2 /bin/false
17 /bin/sh
 1 /bin/sync
 1 /usr/sbin/nologin
Rápido y sencillo.
Leer más

Forzar chequeo de disco en reinicio del sistema

Hoy os quiero presentar un truco tan interesante como sencillo. Hay muchas veces que nos interesa forzar un chequeo de disco cuando el sistema se reinicie, pero que por lo que sea, no podemos reiniciarlo en ese momento. Luego lo reiniciamos y se nos olvida de indicárselo en el parámetro del shutdown, con lo que seguimos en la misma.
Para evitar que eso nos suceda, podemos crear un fichero vacío en la raíz del sistema y que se llame forcefsck. Tan simple como eso y conseguiremos que en el próximo reinicio el sistema compruebe los discos, para a continuación borrar automáticamente dicho fichero.
shell> touch /forcefsck
Leer más

Montando un entorno virtual en Python

Desde hace una época hacia aquí, la gente que me conoce sabe que estoy programando en Python. Aunque no soy programador, es cierto que si hay que meterle mano al código, pues se le mete, tampoco pasa nada. Lo más importante es divertirse con lo que haces, tanto en el ámbito laboral como personal.
Bueno, dejándonos de historias, el detalle es que tras aprender cómo funciona Python, módulos y dependencias, rápidamente me di cuenta de que programar en él estaba ensuciando mucho mi sistema. Cada nuevo módulo que instalaba, realmente quedaba colocado en el sistema, con lo que había que mantenerlo. Puesto que me gusta tener mi escritorio Linux lo más "limpio" posible, trabajando en 4 o 5 cosas diferentes de Python terminaba por tener miles de dependencias instaladas que en realidad el sistema no necesitaba para nada.
La primera solución por la que opté, y que es perfectamente válida, es el empleo de máquinas virtuales. Un VirtualBox específico para cada proyecto. Con ello consigues no ensuciar el sistema y tener todo más o menos ordenado. Así que es viable.
Sin embargo, y de casualidad,  haciendo una búsqueda de módulos Python en Debian (apt-cache al rescate!) descubrí un nuevo paquete más que interesante: python-virtualenv.
python-virtualenv monta un pequeño entorno de desarrollo Python privado a una carpeta sobre el cual instalas los módulos que desees y con los que quieras trabajar, pero sin afectar al sistema. Con ello, se acabaron las instancias de máquinas virtuales para desarrollar en Python. Simplemente creo un nuevo entorno y trabajando con easy_install o pip, instalo todos los módulos que necesite para el proyecto en cuestión. Al salir del entorno virtual, esos módulos no están presentes en el sistema. Por decirlo de cierta forma, "crea un chroot local para cada instancia Python".
Vamos a ver cómo instalarlo y trabajar con él.
  • Instalación
    La instalación del nuevo módulo se torno realmente sencilla en sistemas Debian, ya que está en el repositorio.
    shell> apt-get install python-virtualenv
    
  • Creación del nuevo proyecto
    Es necesario crear una carpeta de trabajo, a nivel local y de usuario (no es necesario ser root) para tener la "copia" de Python y trabajar con él. Para ello,
    shell> cd ~
    shell> virtualenv prueba_python
    
  • Arrancando la instancia virtual
    Dentro de la nueva carpeta, si nos fijamos, podemos ver algo que se parece a una jaula chroot, con aquellas cosas que son necesarias para Python y poco más.
    shell> cd ~/prueba_python
    shell> ls
    bin  include  lib  local
    
    Para comenzar a trabajar con ella, simplemente la activamos.
    shell> source bin/activate
    
  • Trabajando en la instancia
    Si os fijáis, la shell ya ha cambiado y ahora nos muestra que estamos en un entorno Python controlado. Desde aquí tenemos acceso al resto del sistema, pero a nivel de Python, todo lo que se instale, así como las versiones de librerías, etc. estarán en dicha carpeta.
    Si deseamos instalar un nuevo módulo,
    (prueba_python)shell> pip install module
    
    Y a continuación, podemos ya trabajar y lanzar nuestros scripts Python para probarlos.
    (prueba_python)shell> python test.py
    
  • Desactivando la instancia virtual
    Una vez terminamos de trabajar, abandonamos la consola o desactivamos el entorno con,
    (prueba_python)shell> deactivate
    
Como podéis observar, resulta muy sencillo instalar los módulos que necesitemos de esta forma y además sin ensuciar el resto del sistema, ya que todo lo referente a Python quedará bajo dicha carpeta.
Por supuesto, puedes tener cuantas instancias desees, probando diferentes módulos e incluso versiones de Python, para ver cómo afecta una versión al resultado de tu programación.

Espero que tu sistema esté a partir de ahora más limpio ;-)
Leer más

aptsources.sourceslist python module not found

Emplear SaltStack para manejar paquetes y repositorios es algo rápido y que debería ser de las primeras cosas que se implementan. Configurar un repositorio e instalar un paquete es algo así como el "Hola mundo" de la meta-administración. Sin embargo, un posible fallo que acabo de ver en Salt cuando se instala bajo sistemas Debian es que no tiene las dependencias correctamente cumplidas y no permite manejar paquetes, dando el siguiente error.
shell> salt 'salt.domain.com' state.sls salt
salt.domain.com:
----------
      ID: salt
Function: pkgrepo.managed
    Name: deb http://debian.saltstack.com/debian wheezy-saltstack main
  Result: False
 Comment: An exception occurred in this state: Traceback (most recent call last):
     File "/usr/lib/python2.7/dist-packages/salt/state.py", line 1378, in call
       **cdata['kwargs'])
     File "/usr/lib/python2.7/dist-packages/salt/states/pkgrepo.py", line 231, in managed
       sanitizedkwargs = __salt__['pkg.expand_repo_def'](kwargs)
     File "/usr/lib/python2.7/dist-packages/salt/modules/aptpkg.py", line 1361, in expand_repo_def
       'Error: aptsources.sourceslist python module not found'
     CommandExecutionError: Error: aptsources.sourceslist python module not found
 Changes:
...
Como podéis ver, el fallo sale de que desde python, SaltStack está escrito en python, no sabe manejar los repositorios apt y por lo tanto nos soltará el fallo aquí descrito y no establecerá el estado que nos interesa en el sistema, ya que no es capaz. La solución, simplemente instalar el módulo de python para manejar el sistema de paquetería apt. El lógico pensar que no es posible poner de dependencia todos los módulos python que son necesarios, pero éste quizás sí fuese interesante mantenerlo.
shell> apt-get install python-apt
Tras instalar el módulo en el minion, volvemos a lanzar nuevamente el proceso y listo, esta vez ya termina la ejecución correctamente.
shell> salt 'salt.domain.com' state.sls salt
salt.domain.com:
----------
      ID: salt
Function: pkgrepo.managed
    Name: deb http://debian.saltstack.com/debian wheezy-saltstack main
  Result: True
 Comment: Configured package repo 'deb http://debian.saltstack.com/debian wheezy-saltstack main'
 Changes:   
         ----------
         repo:
           deb http://debian.saltstack.com/debian wheezy-saltstack main
----------
...
Leer más

GeoIP desde bash

GeoIP es una base de datos de consulta de localizaciones IP, que dispone de múltiples lenguajes de programación para el acceso a los datos, desde php a python y como no iba a ser menos, también desde la shell de Linux se permiten las preguntas acerca de dónde es una IP concreta.
Lo primero que necesitamos, teniendo en cuenta que partimos de un sistema con geoip-database instalado, es instalar el binario para poder consultar los datos del fichero. Esto nos ofrecerá ya el software que vamos a emplear, geoiplookup y geoiplookup6, por si empleamos IPv6. Tanto la instalación como el uso es bastante sencillo e intuitivo. El paquete está en los repositorios de las principales distribuciones y el uso, simplemente necesitamos la IP de la que deseamos obtener la información.
shell> apt-get install geoip-bin
shell> geoiplookup 77.226.X.Y
GeoIP Country Edition: ES, Spain
Esta base de datos enorme de localizaciones está creada y mantenida por MaxMind, empresa que ofrece una versión "lite" (libre) y otra de pago.
En el caso de Debian Wheezy o la última Ubuntu (14.04), la versión de base de datos que trae es del 2013-08-27. Si por el contrario tenemos una Debian Squeeze, la versión es mucho más antigua, 2010-07-14, por lo que los datos que ahí aparecen pueden no ser del todo correctos. Por lo tanto, antes de ponernos a trabajar, debemos de actualizar las bases de datos. Para ello, recurrimos a la página oficial. Descargamos el fichero GeoLite Country y GeoLite City. El primero para actualizar el que ya tenemos y el segundo, para tener una mayor definición. Tras descargar ambos ficheros, los descomprimimos y los colocamos en el sitio oficial.
shell> cd ~/Descargas
shell> wget http://geolite.maxmind.com/GeoLiteCountry/GeoIP.dat.gz
shell> wget http://geolite.maxmind.com/GeoLiteCity.dat.gz
shell> gunzip GeoIP.dat.gz
shell> gunzip GeoLiteCity.dat.gz
shell> mv ~/Descargas/GeoIP.dat /usr/share/GeoIP/GeoIP.dat
shell> mv ~/Descargas/GeoLiteCity.dat /usr/share/GeoIP/GeoLiteCity.dat
Ahora ya tenemos una base de datos más completa y actualizada. Aunque nos faltarán datos, puesto que no pagamos la suscripción, sí es más moderna que la que trae el paquete.
Si ahora hacemos la misma prueba que antes, pero indicándole que emplee el fichero de localización por ciudad, tenemos lo siguiente,
shell> geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat 77.226.X.Y
GeoIP City Edition, Rev 1: ES, 58, Galicia, Orense, N/A...
Vemos que esta información ya es mucho más útil. No es lo mismo saber que alguien está en España, que que ese alguien está de Orense.
Aunque la integración con php, páginas web o cms no la voy a comentar, sí es bueno comentar la utilidad práctica de este comando, por ejemplo, para comprobar las IPs que consultan una determinada página web. Leyendo los logs de apache, ante un eventual ataque, podemos saber rápidamente de dónde provienen dichas peticiones. Así que con un poco de magia de scripting, tenemos algo tal que así,
for ip in `cat /var/log/apache/access.log | awk '{print $1}' | sort -n | uniq`
do
   echo -ne "$ip\t"
   geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat $ip
done
Donde el resultado es similar al que sigue,
222.77.229.X GeoIP City Edition, Rev 1: CN, 22, Beijing, Beijing, N/A...
222.77.242.X GeoIP City Edition, Rev 1: CN, 07, Fujian, Fuzhou, N/A...
222.79.153.X GeoIP City Edition, Rev 1: CN, 07, Fujian, Fuzhou, N/A...
222.87.129.X GeoIP City Edition, Rev 1: CN, 18, Guizhou, Guiyang, N/A...
223.219.152.X GeoIP City Edition, Rev 1: JP, 40, Tokyo, Tokyo, N/A...
223.240.142.X GeoIP City Edition, Rev 1: CN, 01, Anhui, Hefei, N/A...
223.27.200.X GeoIP City Edition, Rev 1: TH, 60, Surat Thani, Vibhavadi...
Puesto que estamos trabajando con la versión "lite", algunas de las IPs no están incluidas o actualizadas, pero para hacernos una idea general nos sirve.

Si esto te pareció útil, quizás te interesa saber cómo filtrar países con IPTables.
Leer más

vim sin fichero de backup o temporal temporal

Tanto vi como vim por defecto vienen configurados para que creen una copia de seguridad del fichero que estás a editar. Este fichero, suele tener el mismo nombre que el fichero original, pero terminado en ~, y suele localizarse, también por defecto en la misma carpeta que se edita el fichero. Un ejemplo de fichero de backup podía ser file~, my.cnf~, etc.
Si por el motivo que sea no te interesa que vim genere automáticamente ese fichero de backup, puedes deshabilitarlo de forma muy sencilla escribiendo las siguientes opciones en ~/.vimrc.
set nobackup
set nowritebackup
Antes de guardar el fichero, es necesario comprobar que no haya ninguna ocurrencia de "set backup", ya que sino, vim no funcionará.

Si ahora, por el contrario, estás interesado en tener los ficheros de respaldo, pero mejor organizados, también es posible si en vez de lo anterior, escribes la siguiente configuración en el fichero ~/.vimrc.
set backupdir=~/.vim/backup
Antes de emplear nuevamente vim, asegúrate de que el directorio ahí especificado exista, sino créalo o vim no arrancará.
Leer más

vi: Resaltado de sintaxis en archivos no reconocidos

vi o vim, para los no tan puristas, trae como ventaja el resaltado automático de sintaxis de aquellos ficheros que reconoce. Ya bien sea por extensión o bien por que se indica el intérprete que emplea, al abrirlos nos ofrece colores que supuestamente deben ser favorables al trabajo.
Por supuesto, no todo el mundo está a favor de emplear dichos colores, por lo que se pueden habilitar o deshabilitar en cualquier momento con,
:syntax [on|off]
Pero si estamos delante de un fichero para el cual nuestro editar de ficheros no es capaz de detectar el lenguaje en el que está escrito, deberemos de forzar el resaltado de sintaxis. Para ello emplearemos la orden set, pasándole como parámetro el tipo de resaltado que deseamos (perl, php, xml, etc.).
:set filetype=php
Un pequeño y sencillo truco para vi que te puedo simplificar la vida y hacerte más productivo.
Leer más

Simplificar las conexiones a MySQL

Si estamos trabajando con varios sistemas, lo más probable es que terminemos por tener varios servidores de MySQL en la red. Ya bien sea en un esquema lógico (Producción - PreProducción - Desarrollo), ya bien sea por que cada proyecto requiere una instalación diferente. La vida del sysadmin es así ;-)
El detalle es que siempre que tenemos muchos servidores que manejar, debemos de tener muy claro a qué servidor nos vamos a conectar, así como las credenciales del mismo. Para simplificarlo, MySQL, al más puro estilo ssh, permite la creación de un fichero en la home de cada usuario llamado ~/.my.cnf en el cual podemos definir nombres identificativos para cada una de las conexiones y simplemente con llamar al nombre, el cliente MySQL cogerá las credenciales y opciones de cada uno.
Puesto que este fichero es delicado, debemos de tener sumo cuidado en los permisos que le establecemos, así que únicamente lectura/escritura para el usuario.
Si deseamos que todos los usuarios de un sistema puedan hacer uso de un mismo nombre, lo podemos definir en el fichero general de configuración, /etc/mysql/my.cnf. En cualquiera de los casos, la configuración es la misma.
Para añadir varios, pues, debemos de crear una sección [client] para cada uno de ellos, con el nombre que deseemos a continuación. Este nombre es mejor que sea descriptivo. Después, dentro de cada sección podemos definir el usuario, la contraseña del mismo, el equipo o forma de conexión e incluso el prompt si deseamos que lo cambie.
[clientWeb]
   user=root
   password=your_passwd
   host=192.168.1.33
   prompt=\\u@\\h [\\d]>\\_

[clientZabbix]
   user=root
   password=your_passwd
   host=zabbix.local.net
   prompt=\\u@\\h [\\d]>\\_
Ahora que lo tenemos creado, simplemente debemos de indicarle al cliente MySQL que haga uso del nombre. Para ello empleamos la opción --defaults-group-suffix.
Si por ejemplo deseamos conectarnos al servidor web, entonces hacemos,
shell> mysql --defaults-group-suffix=Web
Como veis es mucho más cómodo y fácil de usar ahora el cliente de MySQL. Además, de que no tienes que tener presentes las credenciales para conectarte, lo que te permitirá definir unas contraseñas robustas para las cuentas.
Leer más

Comandos interesantes, iperf

En esta entrada del blog voy a explicar de forma breve cómo medir la velocidad de conexión entre dos equipos. Aunque en redes locales no suele ser un problema, en algunos cosas, especialmente en equipos virtualizados, la red puede ser un cuello de botella importante en los servidores, así que para comprobar y garantizar que esto no es así, qué mejor que asegurarse, pero con números. Para realizar estas comprobaciones vamos a emplear iperf, un  sencillo programa que sirve para medir el ancho de banda entre dos nodos. Aunque esta es la funcionalidad básica, es capaz de hacer más cosas, así que no dudéis en leer la ayuda.
Lo primero es instalar el software, tanto en el servidor como en un par de clientes, ya que para comprobar las velocidades, lo mejor es hacer varias pruebas.
shell> apt-get install iperf
Luego, arrancamos el servidor en el equipo que queramos medir su ancho de banda, tal que así.
shell> iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

Y desde cualquier de los clientes, lanzamos una conexión contra el servidor. Por cada conexión nos ofrecerá un report, ya que no hemos indicado nada de que nos lo deje en un fichero.
shell> iperf -c 192.168.1.101
------------------------------------------------------------
Client connecting to 192.168.1.1.1, TCP port 5001
TCP window size: 22.9 KByte (default)
------------------------------------------------------------
[  3] local 192.168.1.33 port 44888 connected with 192.168.1.101 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3] 0.0-10.0 sec   1.04 GBytes  892 Mbits/sec
Por defecto, el tiempo de conexión es de 10 segundos. Si lo queremos ampliar para ver cómo se comporta el equipo con más carga de red durante más tiempo,
shell> iperf -t40 -c 192.168.1.101
------------------------------------------------------------
Client connecting to 192.168.1.101, TCP port 5001
TCP window size: 22.9 KByte (default)
------------------------------------------------------------
[  3] local 192.168.1.33 port 45317 connected with 192.168.1.101 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3] 0.0-40.0 sec   4.22 GBytes  906 Mbits/sec
Por supuesto, si os interesa saber todas las opciones que están disponibles, aquí os dejo la ayuda.
shell> iperf --help
Usage: iperf [-s|-c host] [options]
       iperf [-h|--help] [-v|--version]

Client/Server:
  -f, --format    [kmKM] format to report: Kbits, Mbits, KBytes, MBytes
  -i, --interval  #      seconds between periodic bandwidth reports
  -l, --len       #[KM]  length of buffer to read or write (default 8 KB)
  -m, --print_mss        print TCP maximum segment size (MTU - TCP/IP header)
  -o, --output    file   output the report or error message to this specified file
  -p, --port      #      server port to listen on/connect to
  -u, --udp              use UDP rather than TCP
  -w, --window    #[KM]  TCP window size (socket buffer size)
  -B, --bind      host   bind to host, an interface or multicast address
  -C, --compatibility    for use with older versions does not sent extra msgs
  -M, --mss       #      set TCP maximum segment size (MTU - 40 bytes)
  -N, --nodelay          set TCP no delay, disabling Nagle's Algorithm
  -V, --IPv6Version      Set the domain to IPv6

Server specific:
  -s, --server           run in server mode
  -U, --single_udp       run in single threaded UDP mode
  -D, --daemon           run the server as a daemon

Client specific:
  -b, --bandwidth #[KM]  for UDP, bandwidth to send at in bits/sec
  -c, --client    host   run in client mode, connecting to host
  -d, --dualtest         Do a bidirectional test simultaneously
  -n, --num       #[KM]  number of bytes to transmit (instead of -t)
  -r, --tradeoff         Do a bidirectional test individually
  -t, --time      #      time in seconds to transmit for (default 10 secs)
  -F, --fileinput name   input the data to be transmitted from a file
  -I, --stdin            input the data to be transmitted from stdin
  -L, --listenport #     port to receive bidirectional tests back on
  -P, --parallel  #      number of parallel client threads to run
  -T, --ttl       #      time-to-live, for multicast (default 1)
  -Z, --linux-congestion set TCP congestion control algorithm (Linux only)

Miscellaneous:
  -x, --reportexclude [CDMSV] exclude Connec, Data, Multicast, Settings, Vserver
  -y, --reportstyle C         report as a Comma-Separated Values
  -h, --help                  print this message and quit
  -v, --version               print version information and quit
Espero que si os hace falta comprobar vuestra conexión de red, esta entrada os haya ayudado.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios