Bash Básico
Conectividad con Google
Para comprobar la conectividad en bash podemos hacer lo siguiente:
#!/bin/sh # Respuesta $? (0 si todo es OK) PEPE=`ping -c 1 google.es` echo $?
Si añadimos una redirección a /dev/null y 2>&1 para que los errores stderr (2) vayan al mismo sitio que la stdout (1) estaría más completo:
#!/bin/sh PEPE=`ping -c 1 google.es` echo $? PEPA=`ping -c 1 loro.yar > /dev/null 2>&1` echo $?
Obtener IP actual
#!/bin/sh
# Obtener la ip actual
IP_ARA=`/sbin/ifconfig eth0 | grep 'inet ' | awk -F '[ :]+' '{print $4}'`
echo $IP_ARA
Buscar paquete a través de APT
#!/bin/sh
# Buscar un paquete apt (mysearch.sh)
if [ "$1" == "" ] ; then
echo "Has de especificar un paquete..."
exit
fi
apt-cache search $1 | grep $1
Sincronizar con un ntpd
#!/bin/sh # Sincroniza con un ntp (myntp.sh) rdate -s ntp.escomposlinux.org
Conectar por ssh
#!/bin/sh # Conecta a una máquina por ssh (myssh.sh) if [ "$#" -eq "2" ]; then ssh $1@$2 else echo "Debes especificar nombre y usuario" fi
Galería de imágenes (thumb)
#!/bin/sh # Crear una galería de mini imágenes (mythumb.sh) for i in `ls *.jpg`; do convert -geometry 320x240 $i galleria-$i done
Renombrado de mayúsculas a minúsculas
#!/bin/sh # Renombrar de mayúscula a minúscula un patrón pasado por argumento (mylowercase.sh) for i in `ls $1`; do mv $i $(echo $i | tr [A-Z] [a-z]); done
Búsqueda de archivos por extensión
#!/bin/bash # Buscar archivos de cierta extensión pasada por parámetro (myfind.sh) find / -name *.$1
Renombrado masivo de extensiones
#!/bin/bash # Renombra todos los archivos extensión $1 a extensión $2 if [ "$#" -eq "2" ]; then for f in *.$1; do mv $f `basename $f .$1`.$2; done; else echo "Debes especificar dos extensiones" fi
Saludo a todos los usuarios conectados
#!/bin/bash
# Manda un saludo a todos los usuarios *conectados* pasados por parámetro
for i in $*; do
if who | grep "^$i" > /dev/null; then
write $i << EoT
Hola $i!
EoT
fi
done
Datos de grupos de un usuario
Escribir un programa usugrup que dado un nombre de login de usuario determine si existe en el sistema, y si es así, presente su nombre de usuario, , número de usuario (UID), grupo primario y grupos secundarios si los tiene, con leyendas adecuadas.
#!/bin/bash # usugrup: datos y grupos de un usuario # USUARIO=$1 id $USUARIO 1>/dev/null 2>&1 ERROR=$? if [ $ERROR -ne 0 ] then echo "El usuario " $USUARIO "no existe" exit fi NOMBRE=`id $USUARIO | cut -f1 -d" "` echo \(UID\) y nombre: $NOMBRE GRUPO1=`id $USUARIO | cut -f2 -d" "` echo \(GID\) y grupo primario: $GRUPO1 if test `id $USUARIO | tr " " "\n" | wc -l` -gt 2 then GRUPOS2=`id $USUARIO | cut -f3 -d" "` echo \(GIDs\) y grupos secundarios: $GRUPOS2 fi
Buscar un patrón dentro de un archivo
Buscar un patrón dentro de un fichero de texto:
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Necesito dos argumentos, el primero"
echo "es el fichero donde debo buscar y"
echo "el segundo es lo que quieres que"
echo "busque."
echo " "
echo "Uso: $0 <fichero> <patron_busqueda>"
echo " "
exit
fi
FICHERO=$1
BUSQUEDA=$2
if [ ! -e $FICHERO ]; then
echo "El fichero no existe"
exit
fi
NUM_VECES=`cat "$FICHERO" | grep --count "$BUSQUEDA"`
if [ $NUM_VECES -eq 0 ]; then
echo "El patron de busqueda \"$BUSQUEDA\" no fue encontrado"
echo "en el fichero $FICHERO "
else
echo "El patron de busqueda \"$BUSQUEDA\" fue encontrado"
echo "en el fichero $FICHERO $NUM_VECES veces"
fi
Ejemplo de case
Ejemplo de uso de case:
#!/bin/bash # case_arg.sh if [ $# -lt 1 ]; then echo "Error. Esperaba al menos un parametro" exit 1 fi case $1 in --opcion1) echo "--opcion1 es una opcion reconocida" exit 0 ;; --opcion2) echo "--opcion2 es una opcion posible" exit 0 ;; linux) echo "\"linux\" es un argumento reconocido" exit 0 ;; *) echo "Parametro no reconocido" exit 1 ;; esac
Ejemplo de while
Ejemplo uso while:
#!/bin/bash j=0 while [ $j -lt 10 ]; do echo "j vale $j" j=$[$j+1] done
Juego de adivinar número
Mítico juego del número usando if/elif:
#!/bin/bash MINUM=8 while [ 1 ]; do echo "Introduzca un número: " read USER_NUM if [ $USER_NUM -lt $MINUM ]; then echo "El número intrododucido es menor que el mío" echo " " elif [ $USER_NUM -gt $MINUM ]; then echo "El número introducido es mayor que el mío" echo " " elif [ $USER_NUM -eq $MINUM ]; then echo "Acertaste: Mi número era $MINUM" break fi done
Ejemplo de funciones()
Ejemplo de funciones:
#!/bin/bash # function1.sh function uso () { echo "Este script recibe dos argumentos." echo "El primero debe ser --opc1 u --opc2 ," echo "y el segundo debe ser un fichero existente." echo "--" } if [ $# -ne 2 ]; then uso exit 1 fi case $1 in --opc1) if [ -e $2 ]; then echo "El script terminó con éxito" exit 0 else uso exit 1 fi ;; --opc2) if [ -e $2 ]; then echo "El script terminó con éxito" exit 0 else uso exit 1 fi ;; *) uso exit 1 ;; esac
Ejemplo de búsqueda avanzada
Hacer un guion de shell que muestre todos los ficheros del directorio $2 que contengan la palagra que se le pase como argumento $1:
#!/bin/bash # $1 patron # $2 directorio en el que buscar echo -e "******* busca.sh *******" grep -r $1 $2* | cut -f1 -d: | sort -u tot=`grep -r $1 $2* | cut -f1 -d: | sort -u | wc -l` echo -e "************************" echo -e " $tot ocurrencias encontradas" echo -e "******* busca.sh *******"
Información del sistema
********** Información Vital ********** Hostname: rwork IPs: 192.168.1.7 127.0.0.1 Kernel: 2.6.17-11-generic Distribución: testing/unstable Uptime: 18:39:34 up 9:09 Usuarios conectados: 12 users Carga del procesador:load average: 0.41, 0.23, 0.21 ********** Hardware ********** Modelo de procesador: Intel(R) Pentium(R) 4 CPU 2.80GHz Velocidad CPU: 2814.081 Bogomips: 5633.32 Memoria actual: total used free shared buffers cached Mem: 516608 88712 427896 0 12196 47616 ********** Dispositivos PCI ********** 00:00.0 Host bridge: Intel Corporation 82865G/PE/P DRAM Controller/Host-Hub Interface (rev 02) 00:01.0 PCI bridge: Intel Corporation 82865G/PE/P PCI to AGP Controller (rev 02) 00:1d.0 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1 (rev 02) 00:1d.1 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2 (rev 02) 00:1d.2 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3 (rev 02) 00:1d.3 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4 (rev 02) 00:1d.7 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller (rev 02) 00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev c2) 00:1f.0 ISA bridge: Intel Corporation 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge (rev 02) 00:1f.1 IDE interface: Intel Corporation 82801EB/ER (ICH5/ICH5R) IDE Controller (rev 02) 00:1f.3 SMBus: Intel Corporation 82801EB/ER (ICH5/ICH5R) SMBus Controller (rev 02) 00:1f.5 Multimedia audio controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) AC97 Audio Controller (rev 02) 01:00.0 VGA compatible controller: ATI Technologies Inc Rage 128 PF/PRO AGP 4x TMDS 02:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) 02:09.0 Ethernet controller: Marvell Technology Group Ltd. 88E8001 Gigabit Ethernet Controller (rev 13) ********** Esquema de particionado ********** S.ficheros Tamaño Usado Disp Uso% Montado en /dev/hda1 27G 4,6G 22G 18% / varrun 252M 92K 252M 1% /var/run varlock 252M 0 252M 0% /var/lock procbususb 10M 108K 9,9M 2% /proc/bus/usb udev 10M 108K 9,9M 2% /dev devshm 252M 0 252M 0% /dev/shm lrm 252M 18M 235M 7% /lib/modules/2.6.17-11-generic/volatile ********** Puntos de montaje ********** /dev/hda1 on / type ext3 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) /sys on /sys type sysfs (rw,noexec,nosuid,nodev) varrun on /var/run type tmpfs (rw,noexec,nosuid,nodev,mode=0755) varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777) procbususb on /proc/bus/usb type usbfs (rw) udev on /dev type tmpfs (rw,mode=0755) devshm on /dev/shm type tmpfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) lrm on /lib/modules/2.6.17-11-generic/volatile type tmpfs (rw) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
Webthumb firefox
Script que abre una conexión con un vnc local, arranca mozilla-firefox con una página específica (terra.es en este ejemplo) y saca un screenshot:
#!/bin/bash vncserver -geometry 800x800 -depth 24 sleep 5 DISPLAY=:1 mozilla-firefox -P "Default User" & sleep 5 DISPLAY=:1 mozilla-firefox -remote "openurl(http://www.terra.es)" sleep 5 DISPLAY=:1 import -window root -resize 200x200 /root/myshot.jpg vncserver -kill :1
Webthumb VNC
This code is from Chimeric, here is the original. That's only a copy&paste because it gives me many ideas:
All it takes is ImageMagick, Firefox the Firefox Fullscreen extension tied together with a little bash script1). The Fullscreen Firefox extension can be configured to hide the tabs/scrollbars when switching Firefox into fullscreen mode via F11. That comes in real handy because you don't have to worry about how to remove these things from the screenshot later. Here's the script.
#!/bin/sh # @author Michael Klier <chi@chimeric.de> # # small script to create a series of website screenshots DATE=$(date -I) FX_BIN=/opt/mozilla/bin/firefox IMM_BIN=/usr/bin/import if [ -f $1 ]; then URLS=$(cat $1) else URLS=$1 fi mkdir ${DATE} && cd ${DATE} CNT=1 for URL in $URLS; do if [ ! -n "$2" ]; then PREFIX=${DATE} else PREFIX=${DATE}-${2} fi if [ $CNT -lt 10 ]; then FNAME=${PREFIX}-0${CNT}.jpg else FNAME=${PREFIX}-${CNT}.jpg fi $FX_BIN $URL && sleep 5 $IMM_BIN -window root -display :0 -resize 1024 $FNAME CNT=$((CNT+1)) done