Mostrando entradas con la etiqueta bash. Mostrar todas las entradas
Mostrando entradas con la etiqueta bash. Mostrar todas las entradas

10 febrero 2012

Cómo saber que tamaño tiene una base de datos en mysql

Desde el cambio a la versión 5 de MySQL in con la introducción de las vistas del Information_schema, saber qué tamaño tiene una base de datos es relativamente fácil, tan fácil como ejecutar esta consulta:



SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB"

FROM information_schema.TABLES GROUP BY table_schema ; 


El problema surge cuando tenemos una base de datos de la versión 4, ya que en estas versiones MySQL no disponía de Information_schema.

Yo he hecho un pequeño script que  parsea la información que proporciona el SHOW TABLE STATUS, de modo que me da un valor aproximado.

El script sería éste:
(lista_basesdatos es una lista con las bases de datos que quiero medir)


#!/bin/bash



for i in `cat lista_basesdedatos`; do



a=`mysql -u root -D ${i} -e 'show table status\G'|grep Data_l|awk '{print $2}'|(tr '\n' +; echo 0)|bc`

b=`mysql -u root -D ${i} -e 'show table status\G'|grep Index_l|awk '{print $2}'|(tr '\n' +; echo 0)|bc`



resultado=`echo $a+$b|bc`;



echo $i $resultado

done








09 septiembre 2010

Script para ejecutar chown sólo en ficheros con un uid determinado

Hace unos días me llegó una petición de  uno de nuestros clientes. Quería poder ejecutar chown sin ser root sobre determinados ficheros. La particularidad de la petición es que si no eres root, sólo puedes cambiar de propietario tus ficheros.

Pensamos en solucionarlo configurando sudo de modo que el usuario pudiera utilizar chown, pero no tuvimos que darle ni una vuelta para darnos cuenta de que era una opción demasiado peligrosa, ya que de esa manera, el usuario podría cambiar el propietario de cualquier fichero.

Ahora sí comenzamos a darle unas vueltas  y finalmente escribimos un script. El script es muy sencillo, existe un array con la lista de usuarios a los que puede pertenecer el fichero o ficheros a modificar, es decir, si tengo el usuario "pepe", el usuario "manolo", y el usuario "perico" y sólo quiero poder ejecutar chown para ficheros que pertenecen a "pepe" y a "manolo", son estos dos usuarios los que tengo que incluir en el array.

La sintaxis es como la de chown, pero con el nombre del script, y si además está en sudoers será:

#sudo mchown usuario fichero
No es que sea la octava maravilla del mundo, pero cumple su función .

El script en cuestión es éste:



#/bin/bash

##########################################################################
# Shellscript:  mchown - cambia el propietario de un fichero o ficheros
# Date       :  2010-9-9
# Categoria   : Utilidades de ficheros
##########################################################################


PN=`basename "$0"`                      # Nombre del programa
VER='1.0'

Uso () {
    echo >&2 "$PN  Cambia los permisos de ficheros con usuarios determinados
                  en el directorio actual, $VER

     Uso: $PN usuario [fichero...]

     Se puede dar el nombre de ficheros determinados o utilizar *. No es recursivo.
     "
     exit 1
}
# Comprobamos si existen los tres usuarios en el sistema

USUARIOS=( usuario1 usuario2 usuario3 usuario4)
i=0
while [ $i -lt 4 ]; do
   usr=`id -u ${USUARIOS[$i]} 2>/dev/null`
   case $? in
      0) USUID[$i]=$usr;
        indice=$i
      ;;
      *)
      ;;
   esac
   (( i=i+1 ))
done

[ $# -lt 1 ] && Uso

# Si nos dan PN,  usuario y fichero continuamos

nuevoprop=$1
while [ $# -gt 1 ] ; do
    for propiet in "${USUID[@]}"; # Iteramos sobre el array
    do
        fichero=`stat -c %u $2` # comprobamos el uid del fichero
        if [ $fichero == $propiet ]; # Validamos el uid del fichero
            then
            chown $nuevoprop $2
            unset fichero
        fi
     shift # movemos la posicion del parametro un lugar
    done

done


09 junio 2010

Cómo analizar la velocidad de red sin ocupar espacio en el disco

Simplemente ejecutando:

# dd if=/dev/zero bs=4096 count=1048576 | ssh user@host 'cat > /dev/null'

Con esto transmitiremos 4 GB que no ocuparán espacio.

Si antes del comando ejecutamos el comando "time" también tendremos el tiempo que tardamos en transmitir los datos.

08 junio 2010

Arrays en bash

En The Geek Stuff hemos encontrado un pequeño tutorial (en inglés) de utilización de arrays en bash.

Muchas veces nos podemos encontrar en la situación de necesitar los arrays en bash y hacer alguna pequeña chapuza para evitarlos o cambiar a otro lenguaje de scripting. Con estos truquillos ya no hay excusa :-)

Aquí está el enlace

05 junio 2010

El comando cat

Pocas veces un comando parece que no hace demasiadas cosas, pero "en la sombra", tiene grandes usos. Este es el caso del comando "cat".

Su definición formal dice que "concatena ficheros e imprime por la salida estándar". Por supuesto esto es cierto, pero podemos hacer más cosas gracias a la potencia de cat y al shell.

En primer lugar es posible que veamos los caracteres no imprimibles; vale..., esto se puede hacer con otros programas como por ejemplo "vi", pero gracias a esta funcionalidad y a la redirección de linux podemos hacer cosas como por ejemplo filtrar la salida de un "ls" para comprobar si hay caracteres no imprimibles en el nombre de un fichero.

# ls -l |cat -vet
total 124$
drwxr-xr-x 2 root root 4096 2010-05-23 08:46 bin$
drwxr-xr-x 4 root root 4096 2010-02-02 05:31 boot$
lrwxrwxrwx 1 root root 11 2009-09-27 22:52 cdrom -> media/cdrom$
drwxr-xr-x 18 root root 4280 2010-06-07 06:04 dev$
drwxr-xr-x 151 root root 12288 2010-06-07 06:05 etc$
drwxr-xr-x 6 root root 4096 2010-06-04 23:48 home$
lrwxrwxrwx 1 root root 33 2009-09-27 23:06 initrd.img -> boot/initrd.img-2.6.28-11-generic$
drwxr-xr-x 16 root root 12288 2010-06-04 16:39 lib$
drwxr-xr-x 7 root root 12288 2010-06-04 16:39 lib32$
lrwxrwxrwx 1 root root 4 2009-09-27 22:52 lib64 -> /lib$
drwx------ 2 root root 16384 2009-09-27 22:52 lost+found$
drwxr-xr-x 3 root root 4096 2010-06-07 06:04 media$
drwxr-xr-x 2 root root 4096 2009-04-13 11:33 mnt$
drwxr-xr-x 7 root root 4096 2010-01-20 05:58 opt$
dr-xr-xr-x 169 root root 0 2010-06-07 08:03 proc$
drwx------ 18 root root 4096 2010-06-04 23:48 root$
drwxr-xr-x 2 root root 12288 2010-06-04 16:39 sbin$
drwxr-xr-x 2 root root 4096 2009-03-06 18:16 selinux$
drwxr-xr-x 2 root root 4096 2009-04-20 15:59 srv$
drwxr-xr-x 12 root root 0 2010-06-07 08:03 sys$
drwxrwxrwt 14 root root 12288 2010-06-07 06:33 tmp$
drwxr-xr-x 13 root root 4096 2009-11-26 08:39 usr$

En este caso no tenemos nombres con caracteres no imprimibles ni tabuladores en el listado, pero sí podemos ver los saltos de línea.

Por supuesto podemos mostrar la salida de cat con número de línea, por si tenemos la necesidad de saber exactamente en qué línea estamos viendo algo:


# ls -l |cat -n
1 total 124
2 drwxr-xr-x 2 root root 4096 2010-05-23 08:46 bin
3 drwxr-xr-x 4 root root 4096 2010-02-02 05:31 boot
4 lrwxrwxrwx 1 root root 11 2009-09-27 22:52 cdrom -> media/cdrom
5 drwxr-xr-x 18 root root 4280 2010-06-07 06:04 dev
6 drwxr-xr-x 151 root root 12288 2010-06-07 06:05 etc
7 drwxr-xr-x 6 root root 4096 2010-06-04 23:48 home
8 lrwxrwxrwx 1 root root 33 2009-09-27 23:06 initrd.img -> boot/initrd.img-2.6.28-11-generic
9 drwxr-xr-x 16 root root 12288 2010-06-04 16:39 lib
10 drwxr-xr-x 7 root root 12288 2010-06-04 16:39 lib32
11 lrwxrwxrwx 1 root root 4 2009-09-27 22:52 lib64 -> /lib
12 drwx------ 2 root root 16384 2009-09-27 22:52 lost+found
13 drwxr-xr-x 3 root root 4096 2010-06-07 06:04 media
14 drwxr-xr-x 2 root root 4096 2009-04-13 11:33 mnt
15 drwxr-xr-x 7 root root 4096 2010-01-20 05:58 opt
16 dr-xr-xr-x 169 root root 0 2010-06-07 08:03 proc
17 drwx------ 18 root root 4096 2010-06-04 23:48 root
18 drwxr-xr-x 2 root root 12288 2010-06-04 16:39 sbin
19 drwxr-xr-x 2 root root 4096 2009-03-06 18:16 selinux
20 drwxr-xr-x 2 root root 4096 2009-04-20 15:59 srv
21 drwxr-xr-x 12 root root 0 2010-06-07 08:03 sys
22 drwxrwxrwt 14 root root 12288 2010-06-07 06:33 tmp
23 drwxr-xr-x 13 root root 4096 2009-11-26 08:39 usr
24 drwxr-xr-x 15 root root 4096 2010-04-24 22:07 var
25 lrwxrwxrwx 1 root root 30 2009-09-27 23:06 vmlinuz -> boot/vmlinuz-2.6.28-11-generic


También lo podemos utilizar como editor rápido. Esto es llamado en bash "here document"


# cat > documento_nuevo << EOF
primera
segunda
tercera
EOF

Con la sentencias anteriores tendremos un fichero llamado documento_nuevo y el contenido será "primera, sgunda, tercera", tal cual lo hemos escrito en el documento

19 diciembre 2007

Cómo ejecutar sentencias de MySQL desde el shell en Linux

Es tan fácil como escribir la sentencia que queremos ejecutar en un fichero y luego utilizar las redirecciones.

Por ejemplo creamos un fichero fichero.txt con una consulta para saber cuántos usuarios tenemos:
SELECT COUNT(users) FROM usuarios

Luego ejecutaríamos:
mysql -umiusuario -pmicontraseña basededatos < fichero.txt

Donde basededatos es la base de datos que queremos de la que queremos hacer la consulta, usuario el usuario de la base de datos y contraseña la contraseña de ese usuario en la base de datos.

Si queremos la salida a fichero, volvemos a redireccionar:
mysql -umiusuario -pmicontraseña basededatos < fichero.txt > otrofichero.txt

12 diciembre 2007

Cómo borrar muchos ficheros pequeños en Linux

Todo está relacionado con el correo :-(
En una carpeta tenía cientos de miles de correos para borrar; no exagero eran 189000.

Intenté borrar con un bucle en bash, pero eso los cargaba todos en memoria, después de una hora todavía no había borrado nada.

También hice un pequeño script en python que metía todos los mensajes en una lista y luego los borraba, pero tampoco me convenció, así que al final me decidí por utilizar find y en poco más de hora y media me borró todo.

El comando que utilicé fue:
find carpetaparaborrar -type f -exec rm -rf '{}' \;

Corregidos los problemas espero no tener que borrar tal cantidad de ficheros pequeños

Cómo saber en que terminal estamos en bash

Después de verlo seguro que más de uno dirá, ¿Por qué no lo probé antes?, vamos lo que dije yo.
El problema para mi viene de que muchas veces tengo varias sesiones abiertas en una máquina y ejecuto "algo" en línea de comando que consume mucho más de lo que a mi me gustaría, lo quiero matar pero me encuentro una salida de w que me muestra mi login varias veces.

Solución, miro en qué terminales me responde la sesión y en la que no me responde la mato. ¿Cómo lo hago?, pues fácil, simplemente ejecuto el comando tty y me dirá mi número de terminal, luego busco los procesos de la terminal que no me responde con ps, y si no puedo matarlos, pues mato la sesión.

03 diciembre 2007

Cómo enviar mails en línea de comandos con bash

Mails en línea de comandos en Windows

Este truco simplemente hace uso del comando mail, que suele estar instalado en todas las distribuciones. Si no estuviera instalado simplemente hay que instalar el paquete mailx.

Yo lo utilizo para probar rápidamente scripts de envío de correo.

La línea que se escribe es ésta:
echo "cuerpo del mensaje" | mail -s "asunto" cuenta@dominio.com

Se puede observar que es muy sencillo.

28 noviembre 2007

Advertencia sobre comandos peligrosos en los foros de Ubuntu

Interesante advertencia en los foros de Ubuntu sobre comandos que están proliferando en estos foros y que pueden ser peligrosos y dañar el sistema.

Tengamos el sistema que tengamos instalado no está mal tenerlos en cuenta.

Este es el post

06 noviembre 2007

Manejando la consola con atajos de teclado de vi

Por defecto la consola de linux tiene configurados los atajos de teclado de emacs. Para activar los atajos de teclado de vi simplemente hay que teclear set -o vi. Una vez lo tenemos hay que pulsar la tecla esc para utilizar el modo comando y la i para volver al bash

Si queremos volver a los de emacs simplemente tecleamos set -o emacs. Esto es muy útil para los negados como yo que somos incapaces de aprender emacs

18 febrero 2005

Más comandos

Ojeando un manual de shell avanzado, he encontrado una lista de comandos muy chula. La mayoría son conocidos, otros no me aparecían en el sistema, hasta que caí en la cuenta de que hay que instalarlos, que no vienen por defecto en bash.

  • users -> muestra el usuario actual
  • groups -> muestra el grupo al que pertenece el usuario actual
  • useradd -> para añadir usuarios, como root
  • userdel -> para borrar usuarios, como root
  • usermod -> para modificar una cuenta de usuario
  • groupmod -> para modificar un grupo
  • id -> muestra el uid y el gid del usuario
  • who -> muestra todos los usuarios logeados en el sistema
  • w -> muestra los usuarios logeados en el sistema y sus procesos asociados
  • logname -> muestra el nombre de usuario actual, tal y como se encuentra en /var/run/utmp
  • su -> para cambiar de usuario
  • sudo -> para ejecutar cosas como otro usuarios. Previamente hay que modificar el archivo sudoers
  • passwd -> para cambiar de contraseña
  • last -> últimos usuarios logeados tal y como aparecen en /var/log/wtmp
  • newgrp -> permite cambiar el grupo del usuario sin desconecta
  • ac -> teóricamente para mostrar el tiempo conectado de los usuarios, pero yo no lo tengo instalado en el sistema ni posibilidad de instalación.

Seguiré con estos repaso de comandos, lo mismo, cuando lo tenga completito, lo hago en una sóla página, pero los siguientes que encontré son un pelín más complicados de comprobar, puesto que son de terminales, con lo cual, hasta que no los pruebe no los publico

15 febrero 2005

Un pequeño repaso a los comandos

Simplemente quiero hacer un pequeño listado de comandos que seguramente iré ampliando, porque siempre aparecen comandos que se me olvidan, o que no conocía y que merece la pena conocerlos:
  • ls -> lista archivos, funciones bastantes complejas como listados recursivos (mirar manual).
  • cat y tac -> concatenadores, tac es el reverso de cat. Pone al revés el archivo entero.
  • rev -> pone al revés cada línea, es decir cada línea mantiene su orden en el archivo, pero el texto está al revés.
  • cp -> copiar
  • mv -> cortar, mover
  • rm -> borrar
  • rmdir -> borrar directorio
  • chmod -> cambiar atributos de un archivo
  • chown -> cambiar propietario de un archivo
  • chgrp -> cambiar grupo de un archivo
  • chattr -> cambiar atributos de un archivo, pero sólo para sistemas de archivo ext2 (o ext3, claro).
  • ln -> crea enlaces blandos o duros a a archivos.
  • basename -> muestra nombre eliminando cualquier elemento del directorio que lo precede, si se especifica también se elimina el sufijo final.
  • find -> búsquedas, ni hablar de su tremenda utilidad
  • xargs -> ejecuciones, también muy, muy útil.
  • grep -> búsquedas de cadenas en archivos.
  • sort -> ordena líneas.
  • uniq -> muestra líneas no repetidas.
  • expr -> para realizar operaciones matemáticas.

Lo dicho, se irá completando esta lista a medida que surgen comandos, o que los recuerdo, porque según lo estaba haciendo recordaba más :-)

09 febrero 2005

Autoalbum

Pues nada, que ahora tocaba hacer el autoalbum de las imágenes para ver los consumos. Lo primero que pensé fue en utilizar una clase en python, un autogenerador en php, un no sé cuánto en C. Ayer leyendo el Código Davinci me di cuenta de que con hacerlo en bash iba a tener lo que necesitaba.

Pues me puse manos a la obra, y pum!, he escrito un script muy pequeño, muy pequeño que me hace los enlaces de las imágenes de cada directorio. De momento no hace nada más, pero es que lo primero que tengo que hacer es tener gráficas de las máquinas, y luego ya veremos cómo las hacemos bonitas.

Total que el resultado provisional es este:



lo que de momento es una cagada, porque parece que tiene ram libre, cuando no es así, y además no existe ram negativo :-(

Por cierto el código de mi minialbum es éste:

#!/usr/local/bin/bash
cd /usr/local/www/data-dist/rrd/imagenes/
for i in `ls -R|grep "./"|cut -c 3-|awk -F : '{print $1}'`;do
cd $i
ls *.png
if [ $? -eq 0 ];then
rm -rf index.html
touch index.html
for l in `ls *.png`;do
nombre=`basename $l .png`
echo "$nombre" >> index.html
done
fi

cd /usr/local/www/data-dist/rrd/imagenes/
done



Por cierto, el enlace a bash es de freebsd, ya se sabe, úsese #!/bin/bash en linux :-)
Sé que no es un prodigio de la programación, pero cumple su función que es lo que importa :-)

08 febrero 2005

Correos con comando "mail"

Una función muy importante de linux muy poco aprovechada es el comando "mail" que sirve para enviar correo. Está muy poco aprovechada por mi, porque casi en exclusiva escribo "mail <>" cuando se pueden poner más cosas si utilizamos las opciones, como por ejemplo:

  • -s: ponemos asunto
  • -c: copiamos a alguien
  • -b: copia oculta
Utilizando todas las opciones sería:

echo "Vamos mañana" | mail -c pepe@dominio.com -b marta@dominio.com -s "fiesta" carlos@dominio.com

En algunas versiones de sistemas operativos no está disponible
el programa mail porque tienen la versión extendida "mailx",
o porque el comando no es "mail" sino "Mail" con mayúscula.
El tratamiento de archivos será lo próximo. Tenía que escribir esto para que no se me olvidara, como fuente shelldorado, pero lo de los archivos si que va a ser tomado en total de la página.